2017-04-06 28 views
0

我想獲取用戶帳戶和備註類型的分區,我需要的是每個管理器記錄(AMID)有1行,並且有多少個用戶有多少筆記由各種不同的紙幣類型組成。單獨列中的CTE分區

我可以用得到正確的結果:

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 

,給了我這樣的事情:

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

但這不會在報表工具工作,我需要把這段代碼我需要每個actionType ID在不同的列,所以這樣的:

AMID ActionTypeID Total  ActionTypeID2 Total2 
1  12    231002 15    354936 

在此先感謝!

+1

你知道最大數量嗎'ActionTypes'? SQL查詢返回固定數量的列。 –

+0

有85個不同的動作類型,沒有限制多少個條目可以放入人注表 –

回答

3

對於動態樞軸與非鮮明/重複Colums

現在,這將轉向或壓縮的列數。例如,如果AMID只有一個ActionTypeID,則無論ActionTypeID如何,這些值都將顯示在第1列和第2列中。這將是一個小問題/容易使列不同,因此「寬」

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

使用下面的測試數據

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

謝謝你這個答案,非常完美。 –

+0

@OwainEsau樂意提供幫助 –