Как правильно использовать сумму (случай... когда... потом...)?
Я хочу суммировать строки с определенным значением в качестве конкретного столбца. Ранее я делал что-то вроде этого:
SELECT date AS 'Date',
sum(CASE license_id WHEN 'a' THEN data.Amount ELSE 0 END) AS 'a',
sum(CASE license_id WHEN 'b' THEN data.Amount ELSE 0 END) AS 'b',
sum(
CASE license_id WHEN '1' THEN data.Amount ELSE 0 END +
CASE license_id WHEN '2' THEN data.Amount ELSE 0 END +
CASE license_id WHEN '3' THEN data.Amount ELSE 0 END
) AS 'c',
sum(
CASE license_id WHEN '10' THEN data.Amount ELSE 0 END +
CASE license_id WHEN '11' THEN data.Amount ELSE 0 END +
CASE license_id WHEN '12' THEN data.Amount ELSE 0 END
) AS 'd'
FROM ...
...
Это именно то, что я хочу, но теперь у меня есть новый сценарий. Мне нужно подвести итоги разных временных результатов. Следующий код НЕ РАБОТАЕТ, а просто объясняет, что я хочу иметь:
SELECT date AS 'Date',
sum(CASE license_id WHEN 'b' THEN data.Amount ELSE 0 END) AS 'b',
sum( CASE license_id WHEN '1' THEN data.Amount ELSE 0 END +
CASE license_id WHEN '2' THEN data.Amount ELSE 0 END +
CASE license_id WHEN '3' THEN data.Amount ELSE 0 END +
b
) AS 'c',
FROM ...
...
Итак, мои вопросы, так как это только часть всего SELECT-Statement:
- Могу ли я как-нибудь сделать это СЛУЧАЙ... КОГДА... ТОГДА... + СЛУЧАЙ... КОГДА... ТОГДА... + ДЕЛО... КОГДА... ТОГДА... проще?
- Есть ли возможность добиться того, чтобы я мог использовать временные результаты в дальнейших расчетах?
Заранее спасибо за помощь!
2 ответа
Проблема в том, что b
не понимается - или в лучшем случае ссылка на столбец в таблице, а не ваше выражение.
Это общее свойство SQL. Вы не можете повторно использовать псевдоним столбца в SELECT
, FROM
, или же WHERE
пункты в том же запросе. У вас есть три основных варианта в MySQL:
- Используйте подзапрос
- Повторите выражение
- Используйте CTE
В этом случае на самом деле существует четвертый вариант, потому что переписывание запроса упрощает логику:
select date,
sum(case license_id when 'b' then data.Amount else 0 end) AS b,
sum(case when license_id in ('b', '1', '2', '3') then data.Amount else 0
end) as c,
from ...
Обратите внимание, что форма case
немного отличается, где логические условия наступают после when
,
Кроме того, одинарные кавычки не нужны для псевдонимов столбцов. Если вы хотите предотвратить проблемы в своем коде, используйте только одинарные кавычки для констант строки и даты.
Так как вы всегда тестируете license_id
и всегда суммируя data.Amount
тогда IN
условие сэкономит вам много печатать:
SELECT
sum(CASE license_id WHEN 'a' THEN data.Amount END) AS a,
sum(CASE license_id WHEN 'b' THEN data.Amount END) AS b,
sum(CASE WHEN license_id IN ('b','1','2','3') THEN data.amount END) as c
...
Вы не указываете, какую СУБД вы используете, но я держу пари, что если она поддерживает CASE
выражения, то, вероятно, также поддерживает IN
,