在 sql 中使用 PIVOT

Using PIVOT in sql

我关注TypeStatusDetailstable。这个 table 有不同的 TypeID。每种类型最多可以有 4 StatusIDs(或更少,例如 TypeID 3 只有 3 StatusIDs)。

RecordCount 显示没有。特定 StatusID 的记录数。 (例如 Type_1 的 3 条待处理记录)

---------------------------------------------------------------
TypeID    Type      StatusID     StatusName    RecordCount
---------------------------------------------------------------
1         Type_1      1          Pending         3
1         Type_1      2         In Process       2
1         Type_1      3         Completed        1
1         Type_1      4         Invalid          1
2         Type_2      1          Pending         4
2         Type_2      2         In Process       5
2         Type_2      3         Completed        6
2         Type_2      4         Invalid          1
3         Type_3      1          Pending         1
3         Type_3      2        In Process        1
3         Type_3      3        Completed         1

我想要的结果如下 table:

根据每种类型,我想根据带有 StatusID 的状态显示 RecordCount。

--------------------------------------------------------------------------------
Type Type  Status  Pending   Status  InProcess  Status  Completed Status Invalid         ID          ID     Count       ID     Count      ID      Count     ID     Count
            for               for                for               for
          Pending           InProcess          Completed          Invalid
--------------------------------------------------------------------------------
1  Type_1     1       3        2         2         3         1       4       1
2  Type_2     1       4        2         5         3         6       4       1
3  Type_3     1       1        2         1         3         1       4       0

我使用了以下查询

SELECT *
FROM (
    SELECT 
       TypeID,Type,StatusName,RecordCount
    FROM #TypeStatusDetails
) as s
PIVOT
(
    SUM(RecordCount)
    FOR StatusName IN ([Pending],[In Process],[Completed],[Invalid]) 
)AS pvt

但是我无法根据每个 StatusName 获取 StatusId 列以将其组合到数据透视表中。

谁能帮我解决这个问题?

您可以使用 条件聚合 而不是 PIVOT:

SELECT TypeID, Type,  
       MAX(CASE WHEN StatusName = 'Pending' THEN StatusID END) AS [Status for Pending],
       SUM(CASE WHEN StatusName = 'Pending' THEN RecordCount ELSE 0 END) AS [Pending],
       MAX(CASE WHEN StatusName = 'In Process' THEN StatusID END) AS [Status for In Process],
       SUM(CASE WHEN StatusName = 'In Process' THEN RecordCount ELSE 0 END) AS [In Process],
       MAX(CASE WHEN StatusName = 'Completed' THEN StatusID END) AS [Status for Completed],
       SUM(CASE WHEN StatusName = 'Completed' THEN RecordCount ELSE 0 END) AS [Completed],
       MAX(CASE WHEN StatusName = 'Invalid' THEN StatusID END) AS [Status for Invalid],
       SUM(CASE WHEN StatusName = 'Invalid' THEN RecordCount ELSE 0 END) AS [Invalid]
FROM TypeStatusDetails
GROUP BY TypeID, Type

以上查询是标准 ANSI SQL,可用于任何 RDMBS。

SELECT 类型 ID,类型,
Coalesce(MAX(CASE WHEN StatusName = 'Pending' THEN StatusID END),0) AS [Status for Pending], SUM(CASE WHEN StatusName = 'Pending' THEN RecordCount ELSE 0 END) AS [Pending], Coalesce(MAX(CASE WHEN StatusName = 'In Process' THEN StatusID END),0) AS [Status for In Process], SUM(CASE WHEN StatusName = 'In Process' THEN RecordCount ELSE 0 END) AS [In Process], Coalesce(MAX(CASE WHEN StatusName = 'Completed' THEN StatusID END),0) AS [Status for Completed], SUM(CASE WHEN StatusName = 'Completed' THEN RecordCount ELSE 0 END) AS [Completed], Coalesce(MAX(CASE WHEN StatusName = 'Invalid' THEN StatusID END),0) AS [无效状态], SUM(CASE WHEN StatusName = 'Invalid' THEN RecordCount ELSE 0 END) AS [无效] 来自 TypeStatusDetails 按类型 ID 分组,类型