Укажите условную сумму для конкретного продукта или элемента

#sql #oracle #aggregate-functions

#sql #Oracle #агрегатные функции

Вопрос:

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

 Product Quantity
a          2
b          3
c          4
d          1
e          5      
 

Мне интересно, как суммировать конкретные продукты, такие как c, d и e.
Я уже пытаюсь это

 SELECT sum(quantity)
  FROM product
 where product.product in ('a', 'b')
 group by product
UNION
select sum(quantity)
  from product
 where product.product IN ('c', 'd', 'e')
 

Но я не могу отобразить название продукта, конец результатов должен выглядеть так

 Product     Quantity
a              2
b              3
sum(c,d,e)   (4 1 5)
 

Комментарии:

1. Итак, вы хотите создать подмножества продуктов (некоторые из них имеют только один элемент, но это не имеет значения) и суммировать по таким подмножествам. Где / как вы храните информацию о том, какие продукты в каком подмножестве? Обычным способом была бы небольшая таблица поиска, показывающая продукт и к какому подмножеству он принадлежит. Если это так, то вы должны объединить две таблицы и сгруппировать по столбцу «подмножество» из второй таблицы.

2. решение проблемы с помощью подзапроса select product, sum(quantity) value from (select case when a.product not in ('a', 'b') then 'Other''s Product' else a.product end product, a.quantity quantity, case when a.product not in ('a', 'b') then 'sum' end validasi from product a) group by validasi, product

3. Какие-то продукты a и c являются особенными, а остальные относятся к категории «другие»? Вам нужно жестко кодировать a и c в запросе, или они задаются пользователем во время выполнения, или откуда еще они берутся? И в выходных данных вы хотите, чтобы «имена» всех других продуктов ( b, d, e ) отображались в первом столбце, как в выходных данных, которые вы показываете? Это можно сделать, это просто выглядит странно (и при более длинных названиях продуктов строка может быть просто слишком длинной).

4. да, я думаю о производительности этого запроса, может быть, это временное решение для меня, сам продукт, который я могу сделать в качестве параметра ввода (динамический)

Ответ №1:

Вы можете использовать оператор CASE для группировки ваших конкретных элементов . Вы можете добавить несколько групп, если хотите. Вам не нужен подзапрос.

 select CASE WHEN ProductName IN ('c','d','e') THEN 'bde' ELSE  ProductName END,
SUM(Quentity) from product
group by CASE WHEN ProductName IN ('c','d','e') THEN 'bde' ELSE  ProductName END
;
 

Комментарии:

1. ах, забыл добавить случай, когда в группе по, спасибо, это тоже работает