2016-12-13 7 views
1

Hier ist meine Probe DB Bedingung gilt:SELECT WHERE subselect SUM

orderID |name |invoiceTotal |packGroup 
-------------------------------------- 
123  |john |5.49   |abc 
456  |bill |10.00  |def 
789  |bill |10.00  |def 

Einige Kunden einen Auftrag haben, irgendein Platz, mehr als nur eine, sondern auf die gleiche Lieferadresse. Der App-Benutzer wird entscheiden, ob Bills zwei Bestellungen zusammen in einem Paket versandt werden sollen. Wenn dies der Fall ist, wird das Feld "packGroup" auf dieselbe eindeutige Zeichenfolge gesetzt.

Jetzt möchte ich Bestellungen auflisten, die dem Benutzer die Möglichkeit geben, eine Preisspanne (und andere Eigenschaften wie Lieferland, Werber usw.) auszuwählen.

So kann ich einfach Folgendes tun, um Aufträge in einer Preisklasse anzuzeigen. Auflistung insgesamt Rechnungsbetrag von 20.

SELECT * 
    FROM orders 
WHERE ... 
    AND (SELECT SUM(amountTotal)/exchangeRatio 
      FROM orders o 
     WHERE packGroup=o.packGroup) > 15 
    AND (SELECT SUM(amountTotal)/exchangeRatio 
      FROM orders o 
     WHERE packGroup=o.packGroup) < 50 
GROUP 
    BY packGroup 

Aber ich bekomme 0 Ergebnisse

SELECT * 
    FROM orders 
WHERE ... 
    AND amountTotal/exchangeRatio > 15 
    AND amountTotal/exchangeRatio < 50 
GROUP 
    BY packGroup 

Jetzt möchte ich nur eine kumuliertes um Bill anzuzeigen. Mein Problem ist nicht, "20" anzuzeigen, aber Bills Aufträge fallen in den Zustand, in dem die Preisspanne zwischen 15 und 50 gilt.

Zur Klarstellung: "exchangeRatio" ist ein anderes Feld in der Tabelle, das sich von 1 unterscheidet, wenn der Auftrag in einer anderen Fremdwährung platziert wurde.

Update: SQLfiddle

+1

Siehe http: // Meta. stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-very-simple-sql-query – Strawberry

+0

Danke @Strawberry für den Schnitt, sieht jetzt viel verständlicher aus. :) – Engle

+0

Könnten Sie einen http://sqlfiddle.com/ Eintrag für das Problem erstellen? – Brian

Antwort

0

Vielleicht ist es dieses:

SELECT orders.*, SUM(amountTotal)/exchangeRatio AS sum_total 
FROM orders 
WHERE 1=1 
GROUP BY orders.packGroup 
HAVING sum_total>15 AND sum_total<50 

oder wenn Sie alle Zeilen möchten, dass die Klausel entsprechen:

SELECT orders.* 
FROM orders 
WHERE 1=1 
AND packGroup = (SELECT o.packGroup 
FROM orders AS o 
GROUP BY o.packGroup 
HAVING (SUM(o.amountTotal/o.exchangeRatio)) BETWEEN 15 AND 50) 
+0

erste Versuche sind sehr vielversprechend, lassen Sie mich es implementieren, dann werde ich wissen, ob dies die Antwort ist. :) – Engle

+0

sehr genial! Vielen Dank. Klappt wunderbar – Engle