【问题标题】:Dynamic Pivot Not displaying right output动态枢轴不显示正确的输出
【发布时间】:2018-01-23 07:07:27
【问题描述】:

我有这张桌子:

Year Month| User| Player  | Manager
1996-06   | 1256|  2      |   1
1997-07   | 1243|  5      |   2

并试图旋转它以使其返回:

       | 1997-06|1996-07
User   | 1256   | 1243
Player | 2      |   5
Manager| 1      |   2

但是我不确定为什么下面的脚本会返回不同的内容:

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME([User]) 
  FROM (SELECT p.[User] FROM dbo.practise AS p
  GROUP BY p.[User]) AS x;
SET @sql = N'
SELECT ' + STUFF(@columns, 1, 2, '') + '
FROM
(
  SELECT [year month], [User]
   FROM dbo.practise AS p

) AS j
PIVOT
(
  SUM([User]) FOR [year month] IN ('
  + STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
  + ')
) AS p;';
PRINT @sql;
EXEC sp_executesql @sql;

返回:

    1256|1243
1   Null|Null

不知道我做错了什么:/

【问题讨论】:

    标签: sql sql-server tsql dynamic pivot


    【解决方案1】:

    你可以稍微简化一下

    示例

    Declare @SQL varchar(max) = '
    Select *
     From  (
            Select [Year Month]
                  ,B.*
             From practise
             Cross Apply (values (''User''   ,cast([User]  as varchar(max)))
                                ,(''Player'' ,cast(Player  as varchar(max)))
                                ,(''Manager'',cast(Manager as varchar(max)))
                         ) B (Item,Value)
    
           ) A
     Pivot (max([Value]) For [year month] in (' + Stuff((Select Distinct ','+QuoteName([year month]) 
                                                          From practise
                                                          Order By 1 
                                                          For XML Path('')),1,1,'')  + ') ) p
     Order by 1 Desc'
    Exec(@SQL);
    --Print @SQL
    

    退货

    Item    1996-06   1997-07
    User    1256      1243
    Player  2         5
    Manager 1         2
    

    生成的 SQL 如下所示

    Select *
     From  (
            Select [Year Month]
                  ,B.*
             From practise
             Cross Apply (values ('User'   ,cast([User]  as varchar(max)))
                                ,('Player' ,cast(Player  as varchar(max)))
                                ,('Manager',cast(Manager as varchar(max)))
                         ) B (Item,Value)
    
           ) A
     Pivot (max([Value]) For [year month] in ([1996-06],[1997-07]) ) p
     Order by 1 Desc
    

    【讨论】:

    • 嗨 john cappelletti ...in the pivot (max([user] for [year month] in etc etc 语句是否可以有多个提取 for (max([user] eg pivot (max ([user]), (max([player]), (max([manager]) for [year month] in (' + stuff...列到一行?
    • @VS1SQL 也许您可以编辑您的问题并提供更好的示例数据。
    • @VS1SQL 要回答您的问题,是的,我们需要 UNPIVOT 动态 Pivot 中的数据。同样,更强大的数据样本和期望的结果将是最有帮助的
    • 抱歉,我已经修改了示例数据和期望的结果作为示例@John Cappelletti
    • @VS1SQL 一瞬间
    猜你喜欢
    • 2016-01-31
    • 2012-07-11
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    相关资源
    最近更新 更多