РАЗДЕЛЕНИЕ ДЛЯ PIVOT-таблицы в T-SQL - PullRequest
1 голос
/ 20 марта 2019

Я люблю оконные функции, и поэтому я использовал простую функцию row_number (), чтобы разделить некоторые данные на основе employeeID. То, что я написал, работает, но я не могу не думать, что это можно написать с помощью PIVOT. Вот код: -

WITH [Roles] AS
(
    SELECT a.EmployeeID, a.StaffRole,
    ROW_NUMBER() OVER (PARTITION BY a.EmployeeID ORDER BY a.StaffRole) AS RowNum
     FROM [GCHHS_Reporting].[dbo].[CathLab_Staff] a
)
SELECT a.EmployeeID, b1.StaffRole AS SR#1, b2.StaffRole AS SR#2, b3.StaffRole AS SR#3, b4.StaffRole AS SR#4, b5.StaffRole AS SR#5 FROM [GCHHS_Reporting].[dbo].[CathLab_Staff] a
    INNER JOIN [Roles] b1
        ON a.EmployeeID = b1.EmployeeID AND b1.RowNum = 1
    LEFT JOIN [Roles] b2
        ON a.EmployeeID = b2.EmployeeID AND b2.RowNum = 2
    LEFT JOIN [Roles] b3
        ON a.EmployeeID = b3.EmployeeID AND b3.RowNum = 3
    LEFT JOIN [Roles] b4
        ON a.EmployeeID = b4.EmployeeID AND b4.RowNum = 4
    LEFT JOIN [Roles] b5
        ON a.EmployeeID = b5.EmployeeID AND b5.RowNum = 5

Приведенный выше код отображает роль, которую каждый сотрудник занял с начала времен. Итак, мой вопрос: Есть ли PIVOT способ сделать это?

Вот образец исходных данных: -

Original Data

Вот пример «оконных» данных: -

'Windowed' data

Есть идеи или как я это сделал, лучший способ?

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Да, это может быть достигнуто гораздо легче, чем с помощью 5 сканирований вашего стола. Вместо того, чтобы использовать PIVOT, я считаю, что условное агрегирование намного проще:

WITH [Roles] AS(
    SELECT CLS.EmployeeID,
           CLS.StaffRole,
           ROW_NUMBER() OVER (PARTITION BY CLS.EmployeeID ORDER BY CLS.StaffRole) AS RowNum
    FROM [GCHHS_Reporting].[dbo].[CathLab_Staff] CLS --a? CathLab doesn't start with "a".
)
SELECT R.EmployeeID,
       MAX(CASE R.RowNum WHEN 1 THEN R.StaffRole END) AS SR1,
       MAX(CASE R.RowNum WHEN 2 THEN R.StaffRole END) AS SR2,
       MAX(CASE R.RowNum WHEN 3 THEN R.StaffRole END) AS SR3,
       MAX(CASE R.RowNum WHEN 4 THEN R.StaffRole END) AS SR4,
       MAX(CASE R.RowNum WHEN 5 THEN R.StaffRole END) AS SR5
FROM Roles R --nor does Roles begin with a "b"
GROUP BY R.EmployeeID;

Я не смог проверить это по вашим данным (так как это изображение), но я сделал небольшую выборку, которая вернула результаты, которые были после. дб <> скрипка

0 голосов
/ 20 марта 2019

PIVOT имеет смысл, если вы хотите вычислить некоторые показатели в вашем запросе. В вашем простом примере достаточно описания кейса, как указано Ларну.

...