【问题标题】:Query to transform unknown number of rows to unknown number of columns查询将未知数量的行转换为未知数量的列
【发布时间】:2012-06-08 17:17:27
【问题描述】:

我一直在寻找不同选项(PIVOT、CROSS JOIN 等)的几个小时,以使用 SQL Server 2008 将未知数量的行转换为未知数量的列,而我比以前更迷失了开始了。

基本上我有 3 张桌子:

角色

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

动作

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

角色动作

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

非常感谢您的帮助!

【问题讨论】:

  • 在此站点中搜索“动态枢轴” - 您所追求的模式已在此处多次解决。
  • @AaronBertrand 非常感谢,我现在已经成功了。只是知道它是如何被调用的。我喜欢“动态支点”!

标签: sql-server sql-server-2008 pivot crosstab


【解决方案1】:

非常感谢 Aaron 让我走上正轨!

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    相关资源
    最近更新 更多