这可以使用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;
请参阅SQL Fiddle with Demo。
在您的情况下,您声明您将拥有未知数量的列。如果这是您的情况,那么您将需要使用动态 sql 来构建要透视的列列表。我演示了静态版本,因为它可以更轻松地将代码转换为动态 SQL。
动态 sql 版本的关键是获取列列表,这是通过查询表并创建列名字符串来完成的。这是使用FOR XML PATH
:
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(colNumber)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
然后将此列表添加到您生成的查询字符串中,最终代码为:
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)
请参阅SQL Fiddle with Demo。
两者都给出结果:
| 1 | 2 | 3 |
-----------------------------
| Orange | Apple | Banana |
| Grape | Corn | Lemon |
| Tomato | Lettuce | Onion |