Получение подсчета каждого продукта для каждого идентификатора - PullRequest
0 голосов
/ 10 марта 2010

Table1

ID product

001 LG
001 Sony
001 LG
001 LG
001 Sony
001 BPL
001 BPL
001 Samsung
002 LG
002 BPL
002 LG
...,

Я хочу подсчитать каждый продукт для каждого человека.

Ожидаемый результат

ID BPL LG Samsung Sony

001 2 3 1 2
002 1 1 0 0
..,

Как сделать запрос о подсчете каждого продукта для каждого человека.

Нужна справка по SQL-запросам.

Ответы [ 3 ]

2 голосов
/ 10 марта 2010

Используйте команду PIVOT для этого:

посмотрите на этот пример:

SELECT s.Name ShiftName,

h.BusinessEntityID,

d.Name DepartmentName

FROM HumanResources.EmployeeDepartmentHistory h

INNER JOIN HumanResources.Department d ON

h.DepartmentID = d.DepartmentID

INNER JOIN HumanResources.Shift s ON

h.ShiftID = s.ShiftID

WHERE EndDate IS NULL AND

d.Name IN ('Production', 'Engineering', 'Marketing')

ORDER BY ShiftName

таблица возврата этого запроса:

ShiftName   BusinessEntityID   DepartmentName
Day              3                            Engineering
Day              9                            Engineering
...
Day              2                            Marketing
Day              6                            Marketing
...
Evening          25                          Production
Evening          18                          Production
Night            14                          Production
Night            27                          Production
...
Night            252                        Production
(194 row(s) affected)

теперь вы можете изменить формат возвращаемой таблицы:

SELECT ShiftName,

Production,

Engineering,

Marketing

FROM

(SELECT s.Name ShiftName,

h.BusinessEntityID,

d.Name DepartmentName

FROM HumanResources.EmployeeDepartmentHistory h

INNER JOIN HumanResources.Department d ON

h.DepartmentID = d.DepartmentID

INNER JOIN HumanResources.Shift s ON

h.ShiftID = s.ShiftID

WHERE EndDate IS NULL AND

d.Name IN ('Production', 'Engineering', 'Marketing')) AS a

PIVOT

(

COUNT(BusinessEntityID)

FOR DepartmentName IN ([Production], [Engineering], [Marketing])

) AS b

ORDER BY ShiftName

возвращаемая таблица как ниже:

ShiftName   Production   Engineering   Marketing
Day              79                 6                    9
Evening          54                 0                    0
Night            46                 0                    0

(3 row(s) affected)
2 голосов
/ 10 марта 2010
Select ID
        , Sum( Case When Product = 'BPL' Then 1 Else 0 End ) As BPL
        , Sum( Case When Product = 'Sony' Then 1 Else 0 End ) As Sony
        , Sum( Case When Product = 'LG' Then 1 Else 0 End ) As LG
        , Sum( Case When Product = 'Samsung' Then 1 Else 0 End ) As Samsung
From Table
Group By ID

Это классическая проблема кросс-таблицы. Вы можете найти много похожих ответов в Google.

0 голосов
/ 10 марта 2010

В общем случае это невозможно, поскольку количество столбцов в выходных данных зависит от количества различных значений, хранящихся в столбце продукта. Если вы заранее знаете все возможные продукты, вы можете жестко закодировать их в запрос, как в ответе @Thomas. В противном случае лучшее, что вы можете сделать, это:

Select ID, product, count(*) as cnt
From Table1
Group By ID, product

Что приведет к таблице как:

ID  product cnt

001 LG      3
001 Sony    2
001 BPL     1
001 Samsung 1
002 LG      2
002 BPL     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...