T-SQL中透视表的分区

T-SQL中透视表的分区,sql,sql-server,tsql,pivot-table,window-functions,Sql,Sql Server,Tsql,Pivot Table,Window Functions,我喜欢窗口函数,因此我使用了简单的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]

我喜欢窗口函数,因此我使用了简单的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
上面的代码显示了每个员工从一开始就担任的角色。所以我的问题是,;有没有一种方法可以做到这一点

以下是原始数据的示例:-

以下是窗口“功能”数据的示例:-


有什么想法或者我是如何做到的,最好的方法吗?

是的,这比使用5次扫描表要容易得多。我发现一些条件聚合比使用
透视更容易:

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;

我无法对您的数据进行测试(因为它是一个图像),但我做了一个小样本,返回了您之前的结果

PIVOT
如果您想在查询中计算一些度量值,那么它最有意义。在您的简单示例中,如Larnu所述,一个case语句就足够了。

是的,我也这么认为,但是在这个例子中,我该如何实现呢?PIVOT需要某种类型的求和或分组计算,但这种数据更为明确。没什么可计算的。这就是我使用窗口功能的原因。嗨,很抱歉回答晚了。我必须承认我不理解你的后续问题。请稍等。请改进它?不用担心,要求已更改,但感谢您的回复。:)