T-SQL 中的数据透视表分区

Posted

技术标签:

【中文标题】T-SQL 中的数据透视表分区【英文标题】:PARTITION TO PIVOT Table in T-SQL 【发布时间】:2019-03-19 22:10:42 【问题描述】:

我喜欢窗口函数,因此我使用了简单的 row_number() 函数来根据员工 ID 拆分一些数据。我写的东西,工作,但我不禁想到它可以用 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 方法可以做到这一点?

这是原始数据的示例:-

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

任何想法或我是如何做到的,最好的方法?

【问题讨论】:

Bad habits to kick : using table aliases like (a, b, c) or (t1, t2, t3) 【参考方案1】:

是的,这比使用 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;

我无法根据您的数据(因为它是图像)对此进行测试,但我做了一个小样本,它返回的结果是之后的结果。 db<>fiddle

【讨论】:

【参考方案2】:

PIVOT 确实最有意义,如果您想在查询中计算一些度量。在您的简单示例中,Larnu 提到的 case 语句就足够了。

【讨论】:

是的,我是这么认为的,但是在这种情况下我将如何实现呢? PIVOT 需要某种类型的求和或分组计算,但此数据更具分类性。没有什么可计算的。这就是我使用窗口函数的原因。 您好,很抱歉回复晚了。我不得不承认我不明白你的后续问题。请你完善一下? 别担心,需求变了,但感谢您的回复。 :)

以上是关于T-SQL 中的数据透视表分区的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL:没有聚合的数据透视表

具有大型数据集的 SQL Server 中的数据透视表

T-SQL :: 列出所有表、列和透视内容

T-SQL:透视数据(十三)

SQL Server 中具有动态列的数据透视表

如何使用 T-SQL 透视表?