Alv*_* VS 2 sql-server transpose pivot
我需要使用以下结构在SQL Server中透视表:
CREATE TABLE table1 (
ColumnNumber int,
RowNumber int,
CellData nvarchar(50)
)
INSERT INTO table1 VALUES
(1, 1, 'Orange'),
(2, 1, 'Apple'),
(3, 1, 'Banana'),
(1, 2, 'Grape'),
(2, 2, 'Corn'),
(3, 2, 'Lemon'),
(1, 3, 'Tomato'),
(2, 3, 'Lettuce'),
(3, 3, 'Onion')
Run Code Online (Sandbox Code Playgroud)
我需要结果表看起来像这样:

因此,ColumnNumber行中的单元格现在是结果表的列名称.最难的部分是不同列数的数量是可变的(所以现在,我们有3个列号,但明天可能有6或10个).
我一直在看PIVOT函数,但是所有的例子都包括a GROUP BY,而且,正如你在这里看到的,我需要一些更像"transpose"excel函数的东西.
谢谢 !!
这可以使用该PIVOT功能来完成.这GROUP BY将是有效的,因为你有一个指标,使每个行不同.对于您的数据,指标是rowNumber列.
如果您有一定数量的列,那么您将需要使用静态数据透视表对它们进行硬编码.代码将类似于以下内容:
select [1], [2], [3]
from
(
select colNumber, RowNumber, CellData
from yourtable
) src
pivot
(
max(CellData)
for colnumber in ([1], [2], [3])
) piv;
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您声明您将拥有未知数量的列.如果这是您的情况,那么您将需要使用动态SQL来构建要透视的列列表.我演示了静态版本,因为它可以更容易地将代码转换为动态SQL.
动态sql版本的关键是获取列的列表,这是通过查询表并创建列名字符串来完成的.这是使用FOR XML PATH:
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(colNumber)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
Run Code Online (Sandbox Code Playgroud)
然后将此列表添加到您生成的查询字符串中,最终代码为:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(colNumber)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + '
from
(
select colNumber, rowNumber, CellData
from yourtable
) x
pivot
(
min(CellData)
for colNumber in (' + @cols + ')
) p '
execute(@query)
Run Code Online (Sandbox Code Playgroud)
两者都给出了结果:
| 1 | 2 | 3 |
-----------------------------
| Orange | Apple | Banana |
| Grape | Corn | Lemon |
| Tomato | Lettuce | Onion |
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16925 次 |
| 最近记录: |