Ich normalisiere einige Tabellen und habe ein Problem gelöst, das ich nicht lösen kann.Gruppe nach Ergebnis der bedingten Unterabfrage
Die alte, nicht-normalisierte Abfrage sieht wie folgt aus:
SELECT
SUM(allorderlines.COUNT),
products.NAME,
products.VOLUME,
people.NAME,
people.ID,
layout.POSTYPE,
IF(allorders.TOTAL = allorders.DISCOUNT, 1, 0) AS ISFREE
FROM
allorderlines
INNER JOIN allorders
ON allorderlines.ORDERID = allorders.ORDERID
INNER JOIN people
ON allorders.EMPLOYEE = people.ID
INNER JOIN layout
ON allorders.POSID = layout.ID
INNER JOIN products
ON allorderlines.PRODUCT = products.ID
WHERE
allorderlines.PRODUCT = ?
GROUP BY
people.ID,
layout.POSTYPE,
ISFREE
ORDER BY
layout.POSTYPE ASC,
people.NAME,
ISFREE ASC,
products.NAME
Das bedeutet, kann ich meine Gruppe Ergebnisse in, ob die Aufträge frei waren (das heißt kostenlos) oder nicht.
In meiner normalisierten Version habe ich keine Summe der Reihenfolge in der Tabelle allorders verfügbar (allorders.TOTAL
und allorders.DISCOUNT
). Um herauszufinden, ob eine Bestellung frei ist, muss ich SUM(allorderlines.LINEPRICE)
und sehen, ob es gleich 0 ist. Die Zeile für das Produkt wird nicht 0 sein, aber eine andere Zeile mit dem diskontierten Wert der Bestellung wird vorhanden sein und der der Summe entsprechen von Produkten, wenn der Auftrag insgesamt frei war: so wie diese:
#Order 23123
Line 1: 2000
Line 2: 1000
Line 3 (discount): -3000
Free: true
#Order 23124
Line 1: 2000
Line 2: 1000
Line 3 (discount): -2000
Free: false
ich kann nicht herausfinden, wie dies zu tun und halten über Logik. Mein engstener Versuch wurde anstelle die Linie für ISFREE
mit so etwas wie:
IF(SUM(allorderlines.LINEPRICE) = 0,1,0) AS ISFREE
Aber das gibt mir einen „kann nicht Gruppe von ISFREE“ -Fehler, vermutlich, weil ich zu einer Gruppe in der nicht zur Verfügung versuchen auf etwas, das ist Lage.
Eine offensichtliche Lösung wäre, die Summe von allorders.LINEPRICE
in der allorders
-Tabelle zu speichern, aber das wäre überflüssig, und ich versuche, davon wegzukommen.
Beachten Sie, dass der DISCOUNT-Wert zuvor positiv war, wo er als Bestellposten jetzt negativ ist. Daher (allorders.TOTAL = allorders.DISCOUNT) = FREE.
EDIT: Um zu klären, die Ergebnismenge etwas aussehen soll:
people.ID people.NAME SUM(COUNT) POSTYPE ISFREE
3 A name 4 1 1
3 A name 24 1 0
3 A name 2 2 1
3 A name 7 2 0
6 Another name 2 1 1
6 Another name 93 1 0
6 Another name 6 2 1
6 Another name 193 2 0
Jede Person 0-4 Zeilen kann zu jedem Preis zu jeder POSTYPE für das jeweilige Produkt und 4 verkauft, 0 bedeutet nichts das bedeutet mindestens 1 frei und 1 verkauft für beide POSTYPEN (wie zum Zeitpunkt des Schreibens gibt es nur 2 Arten).
Gerade als ich ins Bett ging. Ich schaue mir das morgen an. Vielen Dank! – nickdnk
Das gibt mir Zehntausende von Zeilen und der Zeilenzähler ist falsch. Wenn ich am Ende auf L.POSTYPE, P.ID eine Gruppe hinzufüge, bekomme ich eine vernünftigere Menge an Zeilen, aber die Summe der Zeilenanzahl ist immer noch falsch. Ich benötige die Gesamtmenge der verkauften Artikel für eine Person an einem POSTYPE (layout.POSTYPE), gruppiert, ob die fragliche Bestellung frei war oder nicht. – nickdnk
Siehe aktualisierte Frage mit Beispiel. – nickdnk