在sql中使用PIVOT

时间:2016-11-13 07:10:16

标签: sql pivot

我有以下TypeID表。此表具有不同的StatusID s。每种类型最多可以有4 TypeID s(或更少,例如。StatusID 3只有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 s。

RecordCount显示没有。特定StatusID的记录。 (例如,Type_1的3个等待记录)

--------------------------------------------------------------------------------
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

我想要结果如下表所示:

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

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

我使用了以下查询

<meta>

但是我很难根据每个StatusName获取StatusId列以将其组合在pivot中。

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您可以使用条件聚合而不是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中使用。

答案 1 :(得分:0)

SELECT TypeID,Type,
       合并(MAX(CASN WHEN StatusName ='Pending'THEN StatusID END),0)AS [待处理状态],        SUM(StatusName ='Pending'THEN RecordCount ELSE 0 END)的情况AS [Pending],        Coalesce(MAX(CASE WHEN StatusName ='In Process'THEN StatusID END),0)AS [进行中的状态],        SUM(StatusName ='In Process'THEN RecordCount ELSE 0 END)AS [正在处理],        合并(MAX(CASN WHEN StatusName ='已完成'THEN StatusID END),0)AS [已完成状态],        SUM(StatusName ='Completed'THEN RecordCount ELSE 0 END)的情况AS [已完成],        合并(MAX(CASN WHEN StatusName ='无效'THEN StatusID END),0)AS [无效状态],        SUM(当StatusName ='无效'时记录计数ELSE 0结束时的情况)AS [无效] FROM TypeStatusDetails GROUP BY TypeID,Type