2012-06-04 37 views
1

我一直在尋找不同選項(PIVOT,CROSS JOIN等)的小時數,以將未知數量的行轉換爲SQL數量未知的列服務器2008年,我比以前更迷路了。將未知行數轉換爲未知列數的查詢

基本上我有3個表:

角色

|id| name| 
| 1|role1| 
| 2|role2| 
| 3|role3| 

行動

|id| name | 
| 1|action1| 
| 2|action2| 
| 3|action3| 

RoleAction

|roleId| actionId| 
| 1 | 1 | 
| 1 | 2 | 
| 2 | 1 | 
| 3 | 2 | 

反正是有建立一個查詢或SP將變換LEFT JOIN的結果,一個不錯的「轉動」表是這樣的:對你有所幫助

|actionId|actionName|role1|role2|role3|.....|role n| 
| 1 | action1 | 1 | 1 | 0 |.....| 0 | 
| 2 | action2 | 1 | 0 | 1 |.....| 0 | 
| 3 | action3 | 0 | 0 | 0 |.....| 0 | 
| . | .  | . | . | . |.....| . | 
| . | .  | . | . | . |.....| . | 
| n | action n | 0 | 0 | 0 |.....| 0 | 

很多很多的感謝!

+2

在本網站中搜索「動態數據透視」 - 您在此之後的模式已經多次解決。 –

+0

@AaronBertrand非常感謝,我已經設法做到了。這只是知道它被稱爲的一個問題。我很喜歡「動態支點」! – Johann

回答

1

非常感謝亞倫讓我走上正軌!

ALTER PROCEDURE dbo.RoleActionsPivot 
AS 

SET NOCOUNT ON 

DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX); 

SELECT Action.ActionId, Action.ActionName , Role.RoleId, Role.RoleName 
INTO #tmpRoleAction 
FROM Action LEFT JOIN RoleActions ON Action.ActionId = RoleAction.ActionId 
    LEFT JOIN Role ON RoleAction.RoleId = Role.RoleId 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(RoleName) 
      FROM #tmpRoleAction 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT ActionId, ActionName, ' + @cols + ' FROM 

    (SELECT * FROM #tmpRoleAction) x 

    PIVOT (max(RoleId) for RoleName in (' + @cols + ')) p ' 


execute(@query)