Групповые значения на основе расчета, зависящего от другого столбца

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

Пример набора данных:

Item    Currency    Value
1   USD 10
1   PHP 100
2   USD 50
2   PHP 1000
3   PHP 500
select ITEM, 
(case when CURRENCY='usd' then sum(VALUE*2) else sum(VALUE) end ) VALUE
from TABLE1 
inner join TABLE2 on TABLE1.ID=TABLE2.ID
inner join TABLE3 on TABLE3.X=TABLE1.X
inner join TABLE4 on TABLE1.Y=TABLE4.Y
where A=1 and B=2 and C=5 
group by ITEM, CURRENCY
ORDER BY ITEM asc

Желаемый результат (используя x2 в качестве коэффициента для перехода от долларов США к PHP):

Item    Value
1   120
2   1100
3   500

Однако я получаю следующее, которое правильно преобразовало валюту, но не группирует по элементам (т.е. я получаю дублированные строки для элемента, а не 1 строку с суммированным значением):

Item    Value
1   20
1   100
2   100
2   1000
3   500
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

case должен быть аргументом для SUM():

select ITEM, 
       sum(case when CURRENCY='usd' then VALUE*2 else VALUE
           end ) as VALUE
from TABLE1 join
     TABLE2
     on TABLE1.ID = TABLE2.ID join
     TABLE3
     on TABLE3.X = TABLE1.X join
     TABLE4
     on TABLE1.Y = TABLE4.Y
where A = 1 and B = 2 and C = 5 
group by ITEM
ORDER BY ITEM asc;

Примечание. GROUP BY — это только ITEM, потому что это определяет строки, которые вы хотите получить в результирующем наборе.

Привет, Гордон, обратите внимание, что VALUE, если на самом деле это имя столбца, может потребовать экранирования в нескольких вариантах SQL, поскольку это ключевое слово.

Tim Biegeleisen 22.05.2019 13:30

@TimBiegeleisen . . . VALUES — ключевое слово; VALUE обычно нет.

Gordon Linoff 22.05.2019 14:53

Другие вопросы по теме