2017-04-06 8 views
0

ユーザーアカウントとメモ型のパーティションを取得しようとしていますが、各マネージャレコード(AMID)ごとに1行、ユーザーの持つメモ数それぞれ異なる音符タイプで構成されています。個別の列にあるCTEパーティション

私が使用して正しい結果を得ることができます。

AMID ActionTypeID total RN 
1  12    231002 1 
1  15    354936 1 
3  0    74441 1 
3  3    4  1 
3  7    18  1 

しかし、これは私がこのコードを配置する必要があるレポートツールでは動作しません。私は、このような何かを与える

WITH CTE AS 
(
    SELECT AMID, ActionTypeID, COUNT(*) AS total, ROW_NUMBER() OVER (PARTITION BY AMID, ActionTypeID ORDER BY AMID) AS RN 
    FROM personNote 
    GROUP BY AMID, ActionTypeID 
) 
SELECT * FROM CTE 

をのように、私は別の列にあるように、それぞれのactionType IDが必要です:

AMID ActionTypeID Total  ActionTypeID2 Total2 
1  12    231002 15    354936 

ありがとうございます!ダイナミックピボットのために

+1

あなたは'アクションタイプ'? SQLクエリは、固定数の列を返します。 –

+0

85種類のアクションタイプがありますが、personNoteテーブルに入れることができるエントリの数に制限はありません –

答えて

3

非個別/今Colums

を繰り返すと、これは列数をシフトするか、圧縮します。たとえば、AMIDにActionTypeIDが1つしかない場合、ActionTypeIDに関係なく、1列目と2列目に値が表示されます。次のテストデータ

Create Table #PersonNote (AMID int,ActionTypeID int) 
Insert Into #PersonNote values 
(1,12),(1,12),(1,12),(1,12),(1,12),(1,12),(1,12),    -- Cnt 7 
(1,15),(1,15),(1,15),(1,15),(1,15),(1,15),(1,15),(1,15),(1,15), -- Cnt 9 
(3,3),(3,3),(3,3),            -- Cnt 3 
(3,7),(3,7),(3,7),(3,7),(3,7),(3,7),        -- Cnt 6 
(3,12)               -- Cnt 1 
を使用して列を明確にするために/容易に小さな問題であるので、 "広い"

Declare @SQL varchar(max) = Stuff((Select ',' + QuoteName(concat(Col,'A')) + ',' + QuoteName(concat(Col,'T')) 
            From (
              Select Distinct Col=1000+Dense_Rank() over (Partition By AMID Order By ActionTypeID) 
              From #PersonNote 
             ) A 
            Order by 1 
            For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [YAxis] as [AMID],' + replace(replace(@SQL,'A]','A] as [ActionTypeID]'),'T]','T] as [Total]') + ' 
From (
     Select YAxis = AMID 
       ,XAxis = B.XAxis 
       ,Value = B.Value 
     From (
       Select AMID 
         ,ActionTypeID 
         ,XAxis = 1000+Dense_Rank() over (Partition By AMID Order By ActionTypeID) 
         ,Value=COUNT(*) 
       From #PersonNote 
       Group By AMID, ActionTypeID 
       ) A 
     Cross Apply (values (concat(A.XAxis,''A''),A.ActionTypeID) 
          ,(concat(A.XAxis,''T''),A.Value) 
        ) B (XAxis,Value) 

    ) A 
Pivot (sum(Value) For [XAxis] in (' + @SQL + ')) p' 
--Print @SQL 
Exec(@SQL); 

戻り

enter image description here

+0

この回答は大変ありがとうございました。 –

+0

@OwainEsauは喜んでお手伝いします –

関連する問題