2016-11-13 74 views
2

我有以下TypeStatusDetails表。此表有不同的TypeID s。每種類型可以具有最多4個(或更少),即例如對於僅有3個StatusID s)。在sql中使用PIVOT

RecordCount顯示no。的特定狀態ID的記錄。 (如3個掛起記錄TYPE_1)

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

我想結果如下表所示:

根據每種類型,我想顯示的RecordCount按照與StatusID狀態。

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

但我無法得到StatusId列按每個StatusName它樞軸結合起來。

任何人都可以幫助我嗎?

+3

你RDMBS是SQL Server的我承擔? –

回答

0

SELECT TYPEID,類型,
聚結(MAX(CASE WHEN StatusName = '待定' THEN StatusID END),0)AS [用於掛起狀態], SUM(CASE WHEN StatusName = '待定' THEN的RecordCount ELSE 0 END)AS [待定], 合併(MAX(CASE當WHEN StatusName ='In Process'THEN StatusID END),0)AS [正在處理狀態], SUM(CASE WHEN StatusName ='In Process'THEN RecordCount ELSE 0 END)AS [正在處理], 合併(MAX(CASE WHEN狀態名稱='完成'THEN狀態ID END),0)AS [完成狀態], SUM(CASE WHEN StatusName ='Completed'THEN RecordCount ELSE 0 END) AS [Completed], Coalesce(MAX(CASE WHEN StatusName ='Invalid'THEN StatusID E ND),0)AS [爲無效狀態], SUM(CASE WHEN StatusName = '無效',那麼總記錄ELSE 0 END)AS [無效] FROM TypeStatusDetails GROUP BY TYPEID,類型

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

*「[...]可以在任何RDMBS中使用」* >>除列名稱周圍的括號外。當總記錄是不顯示 –

+0

的StatusID 0 –

+0

我們可以使用裏面如果情況漢勒總記錄0條件 –