首页 > 解决方案 > 完成此 SQL 行到列转置的更简单方法是什么?

问题描述

这是来自选择的表格:

+---------+-------+------------+-----------------------------+-------+
|   id    | name  |    date    |          dtinsert           | hour  |
+---------+-------+------------+-----------------------------+-------+
| 1355428 | Max   | 2019-12-16 | 2019-12-16 13:29:21.2500000 | 11:26 |
| 1355433 | Max   | 2019-12-16 | 2019-12-16 13:31:07.5133333 | 11:29 |
| 1355436 | Peter | 2019-12-16 | 2019-12-16 13:32:52.1600000 | 11:30 |
| 1355445 | Peter | 2019-12-16 | 2019-12-16 13:36:34.9466667 | 11:33 |
| 1355456 | Troy  | 2019-12-16 | 2019-12-16 13:41:22.7300000 | 11:36 |
+---------+-------+------------+-----------------------------+-------+

这就是我要的

+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+
|              1              |              2              |              3              |              4              |              5              |
+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+
| 1355428                     | 1355433                     | 1355436                     | 1355445                     | 1355456                     |
| Max                         | Max                         | Peter                       | Peter                       | Troy                        |
| 16/12/2019                  | 16/12/2019                  | 16/12/2019                  | 16/12/2019                  | 16/12/2019                  |
| 2019-12-16 13:29:21.2500000 | 2019-12-16 13:31:07.5133333 | 2019-12-16 13:32:52.1600000 | 2019-12-16 13:36:34.9466667 | 2019-12-16 13:41:22.7300000 |
| 11:26                       | 11:29                       | 11:30                       | 11:33                       | 11:36                       |
+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+

标签: sqlsql-serverpivot

解决方案


你需要做一个动态的数据透视表。首先,您需要声明应创建的所有列。这是通过@Cols声明完成的。然后你需要进行一个包含所有列的调用,这在@SQL此处的声明中完成。最后,调用由 EXEC 执行。由于图像我没有数据,我只能解释逻辑,而不是实际的最终结果,但是如果您将数据添加为表格,我可以将查询调整为那个。

    DECLARE @SQL VARCHAR(1000)
    DECLARE @Cols VARCHAR(1000)

    SET @Cols = Stuff((
                SELECT DISTINCT ',' + ' ' + QuoteName(ID) + ''
                FROM [TableName] A
                ORDER BY 1
                FOR XML Path('')
                ), 1, 1, '') + ''

      --  Print @Cols

 SET @SQL = ' 

    Select
            Name
            ,' + @Cols + '
         From  [TableName] A
          Pivot (MAX([Columns]) For [ID] in ( ' + @Cols + ')
          ) as pvt
          '

        --  Print @SQL
        EXEC (@SQL)

推荐阅读