Помощь с SQL - GroupBy и несколько агрегатов
У меня есть таблица клиентов и таблица детализации заказа. Идентификатор клиента является внешним ключом в таблице детализации заказа (здесь я упрощаю)
Таблица orderdetail содержит следующие столбцы OrderId ItemId CustomerId Size
Столбец Size может принимать любое из следующих значений: 1. lr 2. md 3. sm
Таким образом, таблица orderdetail может иметь следующие записи (столбцы разделены запятыми)
OrderId ItemId CustomerId Размер
1,1,30,lr
1,1,30,md
1,1,30,sm
2,1,30,lr
2,1,30,md
3,1,30,lr
3,1,30,sm
4,1,30,lr
5,1,30,md
6,2,30,sm
7,3,30,md
8,3,30,lr
Что мне нужно, так это действительно эффективный запрос (миллионы записей в таблицах деталей заказа), который имеет следующий вывод для данного customerId (в данном случае 30)
ItemId SizeLr SizeMd SizeSm
1 4 3 2
2 0 0 1
3 1 1 0
Используемый мной запрос использует 3 групповых запроса (по одному для "lr", "md" и "sm"), и в результате он просматривает таблицу 3 раза.
Я ищу решение, которое сканирует таблицу только один раз. Я думаю, что решение использует новую функцию Grouping Set в MSSQL 2008. Но в любом случае, решение с использованием одного сканирования, если я надеюсь, что кто-то может мне помочь.
РЕДАКТИРОВАТЬ
Фактический вывод должен иметь другие поля из таблицы клиентов и таблицы деталей заказа. Эти другие поля не зависят от агрегатов.
Например
ItemName ItemId SizeLr SizeMd SizeSm
A 1 4 3 2
B 2 0 0 1
C 3 1 1 0
Totals 5 4 4
Было бы хорошо, если бы я мог получить итоги для каждого из столбцов размера
2 ответа
Как насчет этого:
SELECT ItemId,
SUM(CASE WHEN Size = 'Lr' THEN 1 ELSE 0 END) AS SizeLr,
SUM(CASE WHEN Size = 'Md' THEN 1 ELSE 0 END) AS SizeMd,
SUM(CASE WHEN Size = 'Sm' THEN 1 ELSE 0 END) AS SizeSm
FROM OrderDetail
WHERE CustomerId = 30
GROUP BY ItemId
Попробуй это:
select Itemid,
sum (case when Size = 'lr' then 1 else 0 end) SizeLR,
sum (case when Size = 'Md' then 1 else 0 end) SizeMd,
sum (case when Size = 'SM' then 1 else 0 end) SizeSM
from orderdetail
group by Itemid
order by Itemid;
Если ItemName зависит от ItemId, вы можете сделать это:
select Itemname, Itemid,
sum (case when Size = 'lr' then 1 else 0 end) SizeLR,
sum (case when Size = 'Md' then 1 else 0 end) SizeMd,
sum (case when Size = 'SM' then 1 else 0 end) SizeSM
from orderdetail
group by Itemid, Itemname
order by Itemid;