2016-11-13 8 views
2

私は以下のTypeStatusDetailsテーブルを持っています。この表は異なるTypeIDです。各タイプは、最大4つのStatusIDを有することができる(すなわち、例えば、TypeID3は、3つだけを有する。StatusID)。SQLでPIVOTを使用

RecordCountは、特定のStatusIDのレコードの数。

各タイプに応じて、私はStatusIDと、ステータスごとのようでRecordCountを表示する: (。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 

私は、次の表のようになりたいです。

-------------------------------------------------------------------------------- 
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列を取得するために問題を抱えています。

誰もがこれで私を助けてくださいことはできますか?

+3

あなたのRDMBSであるSQL ServerのI AS StatusName = '無効' THENのRecordCount ELSE 0 END)仮定? –

答えて

0

SELECTのTypeID、タイプ、
合体(MAX(CASE StatusName = '保留' THEN StatusID END)、0)[保留中のステータス] AS、 SUM(CASE StatusName = 0 ELSEのRecordCount THEN '保留' はEND_SA)[処理中のステータス]、 SUM(ステータスが '処理中'の場合)、RecordCount ELSE 0(完了した時点でステータス名= '処理中'から 'ステータスID終了')、Coalesce (ステータス名= '完了'それからステータスID終了)、0)AS [完了のステータス]、 SUM(CASE WHEN StatusName = '完了' THEN RecordCount ELSE 0 END)AS [処理中]、 Coalesce AS [完了]、 合体(MAXの場合(StatusName = '無効'の場合)StatusID E ND)、0)AS [無効のステータス]、 SUM(CASE WHEN [無効] TypeStatusDetails FROM のTypeID BY GROUP、タイプが

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

RecordCountが0の場合、StatusIDは表示されません –

+0

RecordCount 0の条件の場合は、内部でケースを使用することができます。 –