我目前正在尝试将某些行PIVOT转换为列。问题是我并不总是知道有多少行可用。让我们看一个例子:
Values_Table Columns_Table ------------ ----------- ID ID ColumnsTableID GroupID Value ColumnName
结果”
Columns_Table --------------- ID | GroupID | ColumnName --------------------------------- 0 1 Cats 1 1 Dogs 2 1 Birds 3 2 Pontiac 4 2 Ford 5 3 Trex 6 3 Raptor 7 3 Triceratops 8 3 Kentrosaurus
静态枢纽的SQL FIDDLE范例。我正在尝试实现动态枢轴-http://sqlfiddle.com/#!3/ 2be82/1
因此,这是我的难题:在这种情况下,我希望能够基于GroupID透视未知数量的列。
我希望能够将GroupID 3中的所有行都列为PIVOT。我需要在不知道groupID 3中有多少行的情况下进行此操作。
数据库的设计是一成不变的,所以我对此无能为力。我所能做的就是用我拥有的东西工作:(
那么,说-在这个例子中,有没有人对如何完成将PIVOT将未知数量的行分成列的工作有任何建议?
如果您不希望提前知道这些值,那么您将需要使用动态SQL。这将创建一个将要执行的SQL字符串,这是必需的,因为在运行查询时必须知道列列表。
该代码将类似于:
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX), @groupid as int set @groupid = 3 select @cols = STUFF((SELECT distinct ',' + QUOTENAME(GroupName) from Columns_Table where groupid = @groupid FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = 'SELECT ' + @cols + ' from ( SELECT B.GroupName, A.Value , row_number() over(partition by a.ColumnsTableID order by a.Value) seq FROM Values_Table AS A INNER JOIN Columns_Table AS B ON A.ColumnsTableID = B.ID where b.groupid = '+cast(@groupid as varchar(10))+' ) p pivot ( min(P.Value) for P.GroupName in (' + @cols + ') ) p ' execute sp_executesql @query;
请参阅带有演示的SQL Fiddle。对于3的groupid,结果将是:
| KENTROSAURUS | RAPTOR | TREX | TRICERATOPS | | whatisthiseven | Itsaraptor | Jurassic | landbeforetime | | (null) | zomg | Park | (null) |