【问题标题】:Converting Row to Column dynamically in SQL [duplicate]在SQL中动态地将行转换为列[重复]
【发布时间】:2014-04-13 11:50:08
【问题描述】:

我的 Microsoft SQL 服务器中有如下表。我想将行转换为列。

我的问题是我不知道前面的结果,并且可能超过 3 行 结果。

当前表

ID - Function - Result - MasterKey
1  - 100      - 31     - 7
1  - 125      - 34     - 7
1  - 138      - 39     - 7
.  - .        - .      - .
.  - .        - .      - .

期望的结果

MasterKey - Function1 - Result1 - Function2 - Result2 - Function3 - Result3 - ...
7         - 100       - 31      - 125       - 34      - 138       - 39      - ... 

我怎样才能实现它? 提前致谢。

【问题讨论】:

  • 不,不一样。对于他的情况,它部分知道前面的结果。
  • 但是,如果您查看答案,则不会假定您知道输出行。一般来说,想要在 RDBMS 中执行此操作被认为是代码异味或反模式,但可以做到这一点,并且可以使用 FOR XML,就像我链接到的答案中一样。

标签: sql tsql


【解决方案1】:

如果您有未知数量的函数/结果,则需要动态创建 SQL:

DECLARE @SQL NVARCHAR(MAX) = '';

SET @SQL = 'SELECT MasterKey' + 
            (   SELECT  ', Function' + RowNum + ' = MAX(CASE WHEN RowNumber = ' + RowNum + ' THEN [Function] END)' + 
                        ', Result' + RowNum + ' = MAX(CASE WHEN RowNumber = ' + RowNum + ' THEN Result END)'
                FROM    (   SELECT  DISTINCT 
                                    RowNum = CAST(ROW_NUMBER() OVER (PARTITION BY MasterKey 
                                                                        ORDER BY [Function]) 
                                                    AS VARCHAR(10))
                            FROM    T
                        ) t
                FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') + 
            ' FROM (SELECT MasterKey, [Function], Result, RowNumber = ROW_NUMBER() OVER (PARTITION BY MasterKey ORDER BY [Function]) FROM T) AS T GROUP BY MasterKey';

EXECUTE sp_executesql @sql;

Example on SQL Fiddle

【讨论】:

  • 非常感谢!!!效果很好!!!
猜你喜欢
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 2020-11-19
  • 1970-01-01
相关资源
最近更新 更多