SQL Сервер: несколько запросов выбора - PullRequest
0 голосов
/ 25 января 2020

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

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

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

Результат

Ответы [ 3 ]

0 голосов
/ 25 января 2020

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

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 голосов
/ 25 января 2020

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

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

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

0 голосов
/ 25 января 2020

вариант использования, когда так:

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
...