Как правильно использовать сумму (случай ... когда ... потом ...)? - PullRequest
0 голосов
/ 23 апреля 2019

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

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:

  • Могу ли я как-нибудь сделать это СЛУЧАЙ ... КОГДА ... ТОГДА ... + СЛУЧАЙ ... КОГДА ... ТОГДА ... + СЛУЧАЙ ... КОГДА ... ТОГДА ... проще?
  • Есть ли возможность добиться того, чтобы я мог использовать временные результаты в дальнейших расчетах?

Заранее спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Проблема в том, что 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.

Кроме того, одинарные кавычки не нужны для псевдонимов столбцов. Если вы хотите предотвратить проблемы в своем коде, используйте только одинарные кавычки для констант строки и даты.

1 голос
/ 23 апреля 2019

Поскольку вы всегда тестируете 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.

...