2016-08-17 3 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 
    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, oops, thanks. Будет редактировать. – jarlh

1

От documentation:

Псевдоним не распознается, пока весь список целей не был разобран, а это значит, что вы не можете ссылаться на псевдоним в другом месте в списке целей. Например, следующий оператор не сможет:

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

Вы можете исправить это с помощью подвыборки:

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

Я никогда не создавал хранимую функцию на amazon redshitf. Но, согласно [документации] (http://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_FUNCTION.html), это возможно как в SQL, так и в python. –

Смежные вопросы