Допустим, у меня есть таблица с хранящимися в ней заказами. У этих заказов есть столбец 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