У меня есть таблица продаж продуктов, которые могут выглядеть следующим образом:Эффективное использование SQL GROUP BY, SUM, COUNT
product | amount | ptype | pdate
p1 | 1.00 | sale | 01/01
p1 | 2.00 | base | 01/02
p2 | 1.50 | sale | 02/03
p3 | 5.25 | base | 10/10
, и я хотел бы построить таблицу, которая показывает один продукт для каждой строки, сумма из сумм, если продукт уникален, покажите, что тип else показывает тип как «VAR», если продукт уникален, покажите дату еще, чтобы показать дату как NULL. Так что результат выглядит следующим образом:
product | total | ptype | pdate
p1 | 3.00 | VAR | (NULL)
p2 | 1.50 | sale | 02/03
p3 | 5.25 | base | 10/10
Я достижение результата, мне нужно, выполнив следующие действия:
SELECT DISTINCT product
,(SELECT SUM(amount) FROM T as b GROUP BY b.product HAVING a.product = b.product) as total
,(SELECT CASE WHEN COUNT(*) = 1 THEN a.ptype ELSE 'VAR' END from T as b GROUP BY b.product HAVING a.product = b.product) as ptype
,(SELECT CASE WHEN COUNT(*) = 1 THEN a.pdate ELSE NULL END from T as b GROUP BY b.product HAVING a.product = b.product) as pdate
FROM T as a
Но я хотел бы знать, если есть более эффективный способ, который позволяет выполнить такой же результат.
Этот SQL не будет работать на SQL Server; не уверены в других механизмах баз данных. –
В Sybase это дает мне ошибку, говоря, что 'ptype' и 'pdate' также должны появляться в GROUP BY. –
Ничего себе, я был пойман с моими штанами на этом. Полностью забыл, что для выполнения групповых функций вам необходимо группировать таблицу. – Palladium