2016-08-17 2 views
3

의 출력 내가 USD로 다양한 통화에서 금액을 변환하기 위해 사용하려는 다음 쿼리를 가지고 :사용하여 SQL의 CASE/언제 계산

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 

이 메시지 in_usd does not exist 실패 .

currency total_in_usd 
USD  100.00 
AED  59.00 
GBP  143.01 
... 

답변

2

당신은 거의 올바른 구조를 가지고 - 하나의 작은 팅겨는 잘 작동해야한다 : 당신은 부속으로이 문제를 해결할 수

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

예를 들어, 다음 문은 실패합니다. 금액을 할 때 통화 변환 곱하기 -

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

위대한 .. 그리고 하위 쿼리가 작동하지 않습니다! 엄청 고마워 – FloatingRock

4

파생 테이블의 CASE 표현 부분을 넣어 :

예상 출력은 통화 및 그들의 합계의 목록입니다. 그것의 결과에 GROUP BY를 수행

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, 죄송합니다, 감사합니다. 편집 할 것입니다. – jarlh

1

documentation에서 :

별칭이 인식되지 않는 전체 대상 목록 대상 목록에서 다른 별명을 참조 할 수 없습니다 즉, 구문 분석 될 때까지.

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

우수하고 문서에 대한 링크를 제공해 주셔서 감사합니다! 별도의 메모에서 여러 개의 쿼리에서 참조 할 수 있도록 함수/함수를 만들 수 있습니까? – FloatingRock

+0

아마존 redshitf에 저장된 함수를 생성 한 적이 없습니다. 그러나 [documentation] (http://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_FUNCTION.html)에 따르면 SQL과 Python 모두 가능합니다. –