МНОГОКОНТУЛЬНЫЙ (DISTINCT) от CTE - PullRequest
0 голосов
/ 04 октября 2018

Это для SQL Server 2012: подмножество данных в моем CTE выглядит следующим образом:

Employee | OrderID | OrderType
---------+---------+----------
Kala     | 321111  | 953
Paul     | 321222  | 1026
Don      | 321333  | 1026
Don      | 321333  | 953
Kala     | 321444  | 953

Мне бы хотелось получить следующий результат:

Employee | 953_Order_Count | 1026_Order_Count
---------+-----------------+-----------------
Kala     |        2        |    0
Don      |        1        |    1
Paul     |        0        |    1

Для проверкито, что я хочу, возможно в моем уме, когда я запускаю:

SELECT 
    Employee,
    OrderType,
    COUNT(DISTINCT OrderID) AS 'Count'
FROM
    CTE
GROUP BY 
    employee, ordertype

Возвращается следующий результат:

Employee | OrderType | Count
---------+-----------+------
Kala     | 953       | 1
Paul     | 1026      | 1
Don      | 1026      | 1
Don      | 953       | 1

Закрыть, но недостаточно близко.Поэтому я запускаю:

SELECT 
    Employee,
    COUNT(DISTINCT OrderID) AS 'Total_Orders',
    COUNT(DISTINCT (CASE WHEN OrderType = 1026 THEN OrderID END)) AS '1026_Order_Count',
    COUNT(DISTINCT(CASE WHEN OrderType = 953 THEN OrderID END)) AS '953_Order_Count'
FROM
    CTE
GROUP BY 
    Employee

Результатом является точное первое «число», но остальные возвращают 0. Если бы это не было CTE, я бы использовал рекурсивное утверждение.

Любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Ответ Тима выглядит хорошо.Вы также можете использовать PIVOT:

; with cte (Employee, OrderID, OrderType)
as
(
    select 'Kala', 321111, 953
union select 'Paul', 321222, 1026
union select 'Don', 321333, 1026
union select 'Don', 321333, 953
union select 'Kala', 321444, 953
)
select Employee, [953] as [953_Order_Count],[1026] as [1026_Order_Count]
from 
    (
        select Employee, OrderType from cte ) as sourceData
pivot
(
    count(OrderType)
    for OrderType
    in ([953],[1026])
) as myPivot

Если вы хотите иметь динамические столбцы, основанные на наборе доступных значений в столбце OrderType, вы можете построить запрос динамически.См. @ Taryn ответ на Понимание функции PIVOT в T-SQL для примера.

0 голосов
/ 04 октября 2018

Просто используйте условное агрегирование:

SELECT
    Employee,
    COUNT(CASE WHEN OrderType = 953  THEN 1 END) AS [953_Order_Count],
    COUNT(CASE WHEN OrderType = 1026 THEN 1 END) AS [1026_Order_Count]
FROM CTE
GROUP BY
    Employee;

enter image description here

Демо

Счет 953, например, работает выше, считая 1, когда тип заказа равен 953, и NULL (неявное значение ELSE), когда тип заказа не равен 953. COUNT по умолчанию игнорирует NULL, поэтомуон насчитывает только 953 заказа.

...