1

SQL Server 2008を使用して、不明な数の行を不明な数の列に変換するためのさまざまなオプション(PIVOT、CROSS JOINなど)を何時間も探していましたが、開始する前よりもさらに迷っています。

基本的に私は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    |

とにかく、の結果を次のLEFT JOINような素敵な「ピボット」テーブルに変換するクエリまたはSPを作成する方法はありますか。

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

あなたの助けに感謝します!

4

1 に答える 1

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)
于 2012-06-04T17:31:52.207 に答える