Помощь с SQL - GroupBy и несколько агрегатов - PullRequest
1 голос
/ 13 декабря 2010

У меня есть таблица клиентов и таблица заказов. идентификатор клиента - это внешний ключ в таблице деталей заказа (здесь я упрощаю)

Таблица orderdetail содержит следующие столбцы Номер заказа ItemId Пользовательский ИД Размер

Столбец «Размер» может принимать любое из следующих значений 1. лр 2. мкр 3. см

Таким образом, таблица заказа может содержать следующие записи (я разделил запятыми столбцы)

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. Но в любом случае, решение, использующее одно сканирование, если я надеюсь, что кто-то может мне помочь.

EDIT

Фактический вывод должен содержать и другие поля из таблицы клиентов и таблицы деталей заказа. Эти другие поля не зависят от агрегатов.

Например

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 ]

1 голос
/ 13 декабря 2010

Попробуйте это:

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;
1 голос
/ 13 декабря 2010

Как насчет этого:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...