Как правильно использовать сумму (случай... когда... потом...)?

Я хочу суммировать строки с определенным значением в качестве конкретного столбца. Ранее я делал что-то вроде этого:

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,

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