Я пытаюсь показать sum(grand_total) where is_loyal = 1 и sum(grand_total) where is_loyal = 0 вместе на одном экране результатов (столбец grand_total находится в одной таблице для обоих). Я пробовал подзапросы, присоединение и случай, но пока не повезло. Есть ли способ рассчитать и показать результаты вместе?

Единственный результат, который я могу найти по подзапросам, - ниже, независимо от того, как я изменяю, где предложение дает мне те же данные. Если я немного изменю свой запрос, он выдаст сообщение об ошибке

Msg 512, уровень 16, состояние 1, строка 155
Подзапрос вернул более одного значения. Это не разрешено, если подзапрос следует за =,! =, <, <=,>,> = Или когда подзапрос используется как выражение.

Результат

0
Anil 25 Янв 2020 в 19:12

3 ответа

Лучший ответ

С условной агрегацией:

select date,
  sum(case when loyal = 1 then grand_total end) [Total Loyalty],
  sum(case when loyal = 0 then grand_total end) [Total Spent non-loyalty]
from tablename
group by date
0
forpas 25 Янв 2020 в 16:17

Использовать случай, когда так:

select
sum(case when loyal = 1 then 1 else 0 end) as grand_total_Loyal,
sum(case when loyal = 0 then 1 else 0 end) as grand_total_noneloyal
0
zip 25 Янв 2020 в 16:15

Простой метод использует арифметику:

select sum(loyal * grandtotal) as loyal_grandtotal,
       sum( (1 - loyal)  * grandtotal) as notloyal_grandtotal
from t
where loyal in (1, 0);

Более общее решение использует выражение case. Однако, если у вас есть флаги 0/1, они очень легко вписываются в арифметические вычисления - по причине, почему они предпочтительнее, скажем, строковых флагов.

0
Gordon Linoff 25 Янв 2020 в 17:19