2016-08-17 7 views
3

Ich habe die folgende Abfrage, die ich nutze, um möchte eine Menge von verschiedenen Währungen in USD zu konvertieren:Verwendung von SQL CASE/WHEN Ausgang für die Berechnung

SELECT 
    currency, 
    CASE currency 
     WHEN 'SAR' THEN 0.266 
     WHEN 'EGP' THEN 0.113 
     WHEN 'USD' THEN 1 
     WHEN 'JOD' THEN 1.411 
     WHEN 'GBP' THEN 1.311 
     WHEN 'BHD' THEN 2.652 
     WHEN 'AED' THEN 0.272 
     WHEN 'EUR' THEN 1.111 
     WHEN 'QAR' THEN 0.275 
     WHEN 'KWD' THEN 3.315 
     ELSE 0 
    END as in_usd, 
    SUM(amount)*in_usd as total_in_usd 
FROM 
    mytable 
WHERE 
    created_at >= current_date - '7 days'::INTERVAL 
GROUP BY 
    currency 

Dies schlägt mit der Nachricht in_usd does not exist .

die erwartete Ausgabe ist eine Liste von Währungen und ihre Summen:

currency total_in_usd 
USD  100.00 
AED  59.00 
GBP  143.01 
... 

Antwort

2

Sie haben fast die richtige Struktur - eine geringfügige zwicken sollte es ganz gut funktioniert. Multiplizieren Sie die Währungsumrechnung, wenn Sie die Summe tun -

SELECT 
    currency, 
    SUM(amount)* 
     (CASE currency 
      WHEN 'SAR' THEN 0.266 
      WHEN 'EGP' THEN 0.113 
      WHEN 'USD' THEN 1 
      WHEN 'JOD' THEN 1.411 
      WHEN 'GBP' THEN 1.311 
      WHEN 'BHD' THEN 2.652 
      WHEN 'AED' THEN 0.272 
      WHEN 'EUR' THEN 1.111 
      WHEN 'QAR' THEN 0.275 
      WHEN 'KWD' THEN 3.315 
      ELSE 0 
     END) as total_in_usd 
FROM 
    mytable 
WHERE 
    created_at >= current_date - '7 days'::INTERVAL 
GROUP BY 
    currency 
+0

Das funktioniert super .. und keine Unterabfragen! Danke vielmals – FloatingRock

4

gebe CASE Teil Expression in einer abgeleiteten Tabelle. Habe GROUP BY auf ihrem Ergebnis:

select currency, in_usd, SUM(amount) * in_usd as total_in_usd 
from 
(
SELECT 
    currency, 
    CASE currency 
     WHEN 'USD' THEN 1 
     WHEN 'SAR' THEN 0.266 
     WHEN 'EGP' THEN 0.113 
     WHEN 'USD' THEN 1 
     WHEN 'JOD' THEN 1.411 
     WHEN 'GBP' THEN 1.311 
     WHEN 'BHD' THEN 2.652 
     WHEN 'AED' THEN 0.272 
     WHEN 'EUR' THEN 1.111 
     WHEN 'QAR' THEN 0.275 
     WHEN 'KWD' THEN 3.315 
     ELSE 0 
    END as in_usd, 
    amount 
FROM 
    mytable 
WHERE 
    created_at >= current_date - '7 days'::INTERVAL 
) 
GROUP BY 
    currency, in_usd 
+0

@JaydipJ, oops, danke. Wird bearbeiten. – jarlh

1

Vom documentation:

Die Alias ​​wird nicht erkannt, bis die gesamte Zielliste wird analysiert worden, was bedeutet, dass Sie nicht den Alias ​​an anderer Stelle innerhalb der Zielliste verweisen. Zum Beispiel wird die folgende Anweisung fehlschlagen:

select (qtysold + 1) as q, sum(q) from sales group by 1; 
ERROR: column "q" does not exist 

Sie dies mit einem subselect beheben können:

SELECT inner.currency, inner.in_usd, inner.sum_amount*inner.in_usd as total_in_usd 
from (
    SELECT 
     currency, 
     CASE currency 
      WHEN 'SAR' THEN 0.266 
      WHEN 'EGP' THEN 0.113 
      WHEN 'USD' THEN 1 
      WHEN 'JOD' THEN 1.411 
      WHEN 'GBP' THEN 1.311 
      WHEN 'BHD' THEN 2.652 
      WHEN 'AED' THEN 0.272 
      WHEN 'EUR' THEN 1.111 
      WHEN 'QAR' THEN 0.275 
      WHEN 'KWD' THEN 3.315 
      ELSE 0 
     END as in_usd, 
     SUM(amount) as sum_amount 
    FROM 
    mytable 
WHERE 
    created_at >= current_date - '7 days'::INTERVAL 
GROUP BY 
    currency) inner 
+0

Ausgezeichnet und danke für den Link zur Dokumentation! Kann ich aus dem Fall heraus eine Funktion erstellen, wenn ich sie aus mehreren Abfragen referenzieren kann? – FloatingRock

+0

Ich habe noch nie eine gespeicherte Funktion auf Amazon Redshitf erstellt. Aber laut der [Dokumentation] (http://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_FUNCTION.html) ist es sowohl in SQL als auch in Python möglich. –

Verwandte Themen