2012-06-03 15 views
5

Ich habe die folgende Abfrage, die mir die Summe der Verkäufe gibt:Summieren einer bedingten Anweisung

SELECT SUM(sales) 
FROM 
    (SELECT sales FROM ...) combined 

Ich brauche jetzt eine bedingte Subtraktion auf bestimmte Währungen basiert hinzuzufügen, die Steuern nehmen, so etwas wie dieses, in Pseudo-Code :

SELECT SUM(sales) - (SUM(sales) IF currency IN ('jpy', 'aud') * 0.05) 
FROM 
    (SELECT sales FROM ...) combined 

Wie würde ich diese bedingte SUM oder Unterabfrage erstellen?

Antwort

3

Sie könnten Faktor anwenden, während Summieren:

SELECT SUM(CASE WHEN currency IN ('jpy', 'aud') 
       THEN sales * 0.95 
       ELSE sales 
      END) 
FROM combined 

CASE hat zwei Formen. Dieser überprüft, ob der nach WHEN angegebene Boolesche Ausdruck wahr ist. Wenn dies der Fall ist, werden die Verkäufe um 5 Prozent reduziert. Wenn dies nicht der Fall ist, wird der Ausdruck nach ELSE zurückgegeben. Sie können WHEN ... THEN Paare kombinieren. Der erste Wert, der als wahr ausgewertet wird, gibt den Ausdruck nach THEN zurück.

Sie könnten dies getan haben, wie Sie in einer Frage vorgeschlagen, durch TAX von JPY und AUD Substraktion, wie folgt:

SELECT SUM(sales) 
    - ifnull (SUM(CASE WHEN currency IN ('jpy', 'aud') 
         THEN sales * 0.05 
        END), 0) 
FROM combined 

Aber es würde die Abfrage nicht in irgendeiner Weise helfen.

+0

Danke, das ist eigentlich die einzige, die funktioniert, obwohl ich nicht genug Verständnis von 'CASE' zu erklären, warum! – David542

+2

@ user1383058: Sie könnten ein' CASE-Ausdruck als eine erweiterte Form eines Ausdrucks 'IF()'. Probieren Sie [das Handbuch zu CASE-Ausdrücken] (http://dev.mysql.com/doc/refman/5.6/de/control-flow-functions.html # operator_case) um mehr zu erfahren. –

+0

@ user1383058 Ich habe meine Antwort erweitert. Bitte schön. –

1
select sum(sales) - case when (currency in ('jpy', 'aud') then (Sum(sales) * .05) else 0 end 

(TSQL oder MySQL?)

+1

Wird das funktionieren? Was, wenn Ihre Summe jpy und usd Währungen enthält? – meze

+0

Es wird magisch arbeiten;) heh Vielleicht besser ist - wählen Sie Summe (Umsatz) - Fall wenn (Währung in ('jpy', 'aud') dann (wählen Sie Summe (Umsatz) aus Tabelle wo Währung in ('jpy' , 'aud')) * .05 else 0 end. Sonst müßte man zu einem komplexeren inneren Join auf sich selbst gehen, um eine auf anderen Werten basierende Summe zu erhalten –

+0

Es funktioniert nur, wenn man case in sum() anfügt Auf diese Weise wird es Währung in "Gruppe von" erzwingen. –

1

Ich denke, Alex gerade richtig ist. Ich bin davon ausgegangen, dass Sie nicht jpy mischen und usd etc, so wird nach Währung, nämlich

SELECT currency, 
     SUM(sales) * (1 - CASE WHEN currency IN ('jpy', 'aud') 
          THEN .05 -- 5% Tax 
         ELSE 
          0 -- No tax 
         END) 
FROM 
(
    SELECT 'aud' as currency, 10.00 as sales 
    UNION 
    SELECT 'usd' as currency, 20.00 as sales 
    UNION 
    SELECT 'gbp' as currency, 30.00 as sales 
    UNION 
    SELECT 'jpy' as currency, 40.00 as sales 
) salesdata 
GROUP BY currency 

Returns

aud 9.50 
gbp 30.00 
jpy 38.00 
usd 20.00 

Welche Subtrahiert 5% Rabatt auf den jpy zum Gruppieren und Aud beträgt

2

Da es nur zwei Alternativen sind, könnten Sie auch die IF() Funktion:

SELECT SUM(sales * IF(currency IN ('jpy', 'aud'), 0.95, 1)) 
FROM combined 

Eine andere Methode wäre implizite boolean Umwandlung in 0 oder 1 wie folgt zu verwenden:

SELECT SUM(sales * (1 - currency IN ('jpy', 'aud') * 0.05)) 

Die currency IN ('jpy', 'aud') boolescher Ausdruck würde implizit in entweder 0 (wenn falsch) oder 1 (wenn wahr) konvertiert werden, und das würde entwederergebenoder sales * (1 - 0.05), entsprechend.

Verwandte Themen