Допустим, у меня есть таблица с хранящимися в ней заказами. У этих заказов есть столбец OrderType
, указывающий, что это за заказ.
У этих заказов также есть столбец, в котором указано, какие заказы следует сгруппировать (OrderGroup
).
Теперь мне нужно найти OrderGroups
, у которых есть два OrderTypes
из 3845 И один OrderType
из 5188.
Я построил свой обычный запрос с помощью GROUP BY
следующим образом:
SELECT OrderGroup
FROM dbo.Order orders
GROUP BY orders.OrderGroup
ORDER BY orders.OrderGroup
Но теперь, когда мне нужно добавить критерии для строк OrderType
, я в тупике. Это логика, которую я ищу (не настоящий SQL):
SELECT OrderGroup
FROM dbo.Order orders
GROUP BY orders.OrderGroup
HAVING (COUNT(orders.OrderType) = 2 WHEN orders.OrderType = 3845)
AND (COUNT(orders.OrderType) = 1 WHEN orders.OrderType = 5188)
ORDER BY orders.OrderGroup
Есть ли способ сделать что-то подобное в SQL Server 2019?
Найдите «условное агрегирование».
Вы могли бы это сделать where OrderType in (3845, 5188) group by OrderGroup having sum(OrderType) = 12878
Ну, я думаю, это, вероятно, вызвало бы неодобрение...
Вам нужно создать выражения count
для условного подсчета соответствующих заказов, а затем сравнить их с ожидаемыми значениями:
SELECT OrderGroup
FROM dbo.Order orders
GROUP BY orders.OrderGroup
HAVING COUNT(CASE orders.OrderType WHEN 3845 THEN 1 END) = 2 AND
COUNT(CASE orders.OrderType WHEN 5188 THEN 1 END) = 1
ORDER BY orders.OrderGroup
HAVING COUNT( CASE WHEN OrderType = 3845 THEN 1 END ) = 2 AND COUNT( CASE WHEN OrderType = 5188 THEN 1 END ) = 1