Announcement

Collapse
No announcement yet.

Nach Preisen ausgeben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Nach Preisen ausgeben

    Danke für Eure Hilfe.

    Ich habe schon eine nächste Herausforderung.

    In einer Tabelle stehen Staffelpreis. Von den Staffelpreisen gibt es 2 Arten, einmal eine Rabattstaffel und einmal eine Preisstaffel.
    Beide Typen können gleichzeitig existieren. In der Regel gib eine Rabattstaffel. Parallel dazu kann es eine zeitlich begrenze Preisstaffel
    geben die eine höhere Priorität als die Rabattstaffel hat.

    Die Tabelle dbo_staffelpreis sieht so aus

    PHP Code:
    id      |  artikelnr typ |    von     |     bis     |  menge |  preis rabatt
    ---------------------------------------------------------------------------------
    1681954   91410208248     1      0000-00-00   0000-00-00        5       0.00       3.00
    1681955   91410208248     1      0000
    -00-00   0000-00-00       10       0.00       5.00
    1681956   91410208248     1      0000
    -00-00   0000-00-00       30       0.00       7.00
    1681957   91410208248     1      0000
    -00-00   0000-00-00       60       0.00      10.00
    1681958   91410208248     2      2015
    -09-01   2015-10-31        5       8.99       0.00
    1681959   91410208248     2      2015
    -09-01   2015-10-31       10       8.50       0.00
    1681960   91410208248     2      2015
    -09-01   2015-10-31       30       8.20       0.00
    1681961   91410208248     2      2015
    -09-01   2015-10-31       60       7.99       0.00 
    Die Abfrage sieht so aus, b.artikel_preis ist der Basispreis für die Berechnung:

    PHP Code:
    SELECT
            b
    .artikel_preis,
    CASE
        
    when a.typ and CURDATE() BETWEEN von AND bis then min(distinct a.preis)
        else 
    min(distinct b.artikel_preis - ((b.artikel_preis a.rabatt) / 100))
    end as preis

    from
            dbo_staffelpreis a
    INNER JOIN
            dbo_artikel b
    ON
            a
    .artikelnr b.artikel_nr
    AND
            
    a.artikelnr '91410208248'
    AND
            
    a.menge <= 
    Leider funktioniert das nicht wie ich es mir dachte, es wird immer nur der Preis für die Rabattstaffel ausgegeben, egal ob der typ 1 oder 2 ist.
    Wenn es eine Preisstaffel innerhalb des definierten Zeitraums gibt, soll immer der Preis ausgegeben werden, ansonsten soll der Rabattpreis berechnet werden.
    Wie mache ich das in einer Abfrage?

    Gruß
    Nevada
    Zuletzt editiert von Nevada208; 03.10.2015, 19:31.

  • #2
    Prüfe, welche Daten wirklich in der Tabelle stehen!
    Artikelnr ist ein String? Prüfe den Feldinhalt der Tabellen mit Trim usw. durch.
    Du verwendest Aggregatfunktionen ohne Group, da rät die Db schon mal gern, was sie ausgeben soll.
    Gruß, defo

    Comment


    • #3
      Hallo defo,

      danke für Deine Antwort. Im Warenwirtschaftssystem können Artikelnummern auch alphanummerisch, daher muss ich sie als Sting verarbeiten.
      Wenn ich GROUP BY typ mache bekomme ich beide Werte, also den Preis berechet aus dem Rabatt und den Preis. Die Abfrage:

      PHP Code:
      SELECT
                                      b
      .artikel_preis,
                                      
      a.typ,
                          CASE

                              
      when     a.typ and CURDATE() BETWEEN von AND bis then min(distinct preis)

                              else     
      min(distinct b.artikel_preis - ((b.artikel_preis a.rabatt) / 100))

                          
      end as preis

                          from
                                      dbo_staffelpreis a

                          INNER JOIN
                                      dbo_artikel b
                          ON
                                      a
      .artikelnr b.artikel_nr
                          
      AND
                                      
      a.artikelnr '91410208248'
                          
      AND
                                      
      a.menge <= 7
                          GROUP BY 
                                      typ 
      bringt mir das Ergebnis:

      PHP Code:
      artikel_preis     typ     preis
      9.12              1         8.846400
      9.12              2         8.990000 
      Das ist schon mal nicht schlecht weil ich es im Nachgang mit PHP weiter bearbeiten könnte. Ich möchte es aber gern
      in der Abfrage erledigen. Wie mache ich das?

      Gruss Nevada

      Comment


      • #4
        so jetzt noch ein wenig komplizierter:

        Es gibt 4 Preise:

        1. Aktionspreis => Priorität 1
        2. Staffelpreis => Priorität 2
        3. Rabattstaffel => Priorität 3
        4. Standardpreis => Priorität 4

        Die Abfrage sieht jetzt so aus:

        PHP Code:
        SELECT
                    b
        .artikel_preis// Standardpreis
                       
        b.artikel_apreis// Aktionspreis
                    
        b.artikel_nr,

        CASE        
        when a.typ 1 then min(distinct b.artikel_preis - ((b.artikel_preis a.rabatt) / 100)) END as rabattstaffel,
        CASE        
        when a.typ 2 then min(distinct a.preisend as preisStaffel,
        CASE         
        when b.artikel_apreis and CURDATE() BETWEEN artikel_avon AND artikel_abis then b.artikel_apreis else 0 end as aktionspreis

        from
                    dbo_staffelpreis a

        INNER JOIN
                    dbo_artikel b
        ON
                      a
        .artikelnr b.artikel_nr
        AND
                       
        a.artikelnr '91410208248'
        AND
                      
        a.menge <= 10
        GROUP BY
                    a
        .typ 
        Das Ergebnis passt auch schon, nur das ich 2 Zeilen zurück bekomme und nicht eine

        PHP Code:
        artikel_preis     artikel_apreis     artikelnr     rabattstaffel     preisStaffel     aktionspreis
        9.12                 8.50        91410208248       8.664000            NULL               8.50
        9.12                 8.50        91410208248         NULL              8.59               8.50 
        Wie bekomme ich das Ergebnis in eine Zeile?

        Comment


        • #5
          Was genau willst Du denn in einer Zeile haben? Alle vier Preise?
          So bekommst Du das nicht sinnvoll hin, weil der Typ für jede Zeile berücksichtigt wird. Das ist aber auch i.O. so , nehme ich mal an?!

          Geht es Dir einfach nur um die Ausgabe von Aktionspreis, Staffelpreis, Rabattstaffel und Standardpreis in einer Zeile musst Du entweder Dich auf einen Typ festlegen oder mit zwei Zeilen leben.
          Die Werte sind ja vom Typ abhängig, so daß Du gar nicht erreichen kannst, was Du genau willst.

          Es sei denn, Du schaust Dir mal Pivot-Tabellen an, falls das was für Dich ist.
          PHP rocks!
          Eine Initiative der PHP Community

          Comment

          Working...
          X