Как сделать Sum() с условием?

У меня есть такая таблица

+----+------+-----+
| ID | Type | Qty |
+----+------+-----+
| 1  | 1    | 10  |
| 2  | 1    | 10  |
| 3  | 2    | 15  |
| 4  | 1    | 20  |
| 5  | 2    | 10  |
+----+------+-----+

Как сделать динамическую сумму на основе поля условия «Тип».

Что-то вроде этого:

SELECT 
    Type, 
    CASE WHEN Type = 1 THEN SUM(Qty) 
         ELSE Qty 
    END AS SumQty
FROM tbl
GROUP BY ?? 

И я хочу получить такой результат:

+------+--------+
| Type | SumQty |
+------+--------+
| 1    | 40     |
| 2    | 15     |
| 2    | 10     |
+------+--------+

Я знаю, что могу сделать это с помощью предложения UNION. Но если вы знаете динамический запрос для достижения такого результата, сообщите мне. Любое решение будет оценено. Благодарность


person user3867892    schedule 23.09.2015    source источник
comment
Динамический запрос — это просто запрос, созданный во время выполнения, а не известный заранее. Это не является взаимоисключающим с запросом, содержащим предложение объединения.   -  person paxdiablo    schedule 23.09.2015


Ответы (1)


Вы можете сделать два запроса, один для нужного типа и один для всех остальных, а затем объединить их вместе, например:

select type, sum(qty) as sumqty from tbl where type = 1 group by type
union all
select type, qty as sumqty from tbl where type <> 1

Тестирование в sqlfiddle:

create table tbl (id int, type int, qty int);
insert into tbl (id, type, qty) values (1, 1, 10);
insert into tbl (id, type, qty) values (2, 1, 10);
insert into tbl (id, type, qty) values (3, 2, 15);
insert into tbl (id, type, qty) values (4, 1, 20);
insert into tbl (id, type, qty) values (5, 2, 10);
===
select type, sum(qty) as sumqty from tbl where type = 1 group by type
union all
select type, qty as sumqty from tbl where type <> 1

дает вам то, что вы хотите:

type    sumqty
----    ------
   1        40
   2        15
   2        10
person paxdiablo    schedule 23.09.2015
comment
Я знаю, что могу сделать это с помощью предложения UNION. Но что, если не использовать предложение UNION? - person user3867892; 23.09.2015
comment
@user3867892 user3867892, мой совет: используйте союз, а не дурачьтесь, пытаясь найти другой способ, основанный на каком-то искусственном ограничении. Это действительно самый простой способ. Конечно, если у вас есть веская причина для ограничения, сообщите нам об этом, чтобы мы могли скорректировать наш подход. - person paxdiablo; 23.09.2015
comment
да, причина в том, что у меня есть тонны запросов, и я не могу использовать UNION для выполнения того же запроса, хотя и с другим условием. - person user3867892; 23.09.2015
comment
@ user3867892: в этом случае вы можете построить запрос динамически на основе значений, которые вы хотите и не хотите агрегировать (используя in и not in, если это сложнее, чем простая проверка равенства/неравенства или двух диапазонов). Это будет включать предложение объединения, а затем вы запускаете динамически сгенерированный запрос. Как я сказал в своем комментарии к вопросу, они не исключают друг друга. - person paxdiablo; 23.09.2015