我问了这个问题,它被标记为How to pivot unknown number of columns & no aggregate in SQL Server?的副本,但这个答案对我没有帮助。
我有一个看起来像这样的数据表,其中包含未知数量的行和值。
RecID Name Value
1 Color Red
2 Size Small
3 Weight 20lbs
4 Shape Square
我需要一个会返回这样的数据的查询,为每一行构建一列。除了列标题“Name”和“Value”之外,我无法对其进行任何硬编码。
Color Size Weight Shape
Red Small 20lbs Square
到目前为止,这是部分工作:
INSERT INTO @Table VALUES
(1,'Color' ,'Red'),
(2,'Size' ,'Small'),
(3,'Weight','20lbs'),
(4,'Shape' ,'Square')
;with mycte
as
(
SELECT rn,cols,val
FROM (SELECT row_number() over(order by Name) rn, Name, Value
FROM @Table) AS src1
UNPIVOT (val FOR cols
IN ( [Name], [Value])) AS unpvt
)
SELECT *
FROM (SELECT rn,cols,val
FROM mycte) AS src2 PIVOT
( Max(val) FOR rn IN ([1], [2], [3])) AS pvt
返回:
cols 1 2 3
Name Color Shape Size
Value Red Square Small
这个问题似乎无法解决。
任何指导都会很棒我现在已经坚持了一段时间。
答案 0 :(得分:2)
declare @collist nvarchar(max)
SET @collist = stuff((select distinct ',' + QUOTENAME(name)
FROM #t -- your table here
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
declare @q nvarchar(max)
set @q = '
select *
from (
select rn, name, Value
from (
select *, row_number() over (partition by name order by RecID desc) as rn
from #t -- your table here
) as x
) as source
pivot (
max(Value)
for name in (' + @collist + ')
) as pvt
'
exec (@q)
答案 1 :(得分:0)
到现在为止,我已经达到了以下代码,希望它可以帮到你,
当前的输出来自
Color Shape Size Weight
Red NULL NULL NULL
NULL NULL Small NULL
NULL NULL NULL 20lbs
NULL Square NULL NULL
Create table DyTable
(
tid int,
Name varchar(20),
Value varchar(20)
)
INSERT INTO DyTable VALUES
(1,'Color' ,'Red'),
(2,'Size' ,'Small'),
(3,'Weight','20lbs'),
(4,'Shape' ,'Square')
DECLARE @Cols NVARCHAR(MAX);
DECLARE @Cols1 NVARCHAR(MAX);
SELECT @Cols = STUFF((
SELECT DISTINCT ', ' + QUOTENAME(Name)
FROM DyTable
FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)'),1,2,'')
,@Cols1 = STUFF((
SELECT DISTINCT ', max(' + QUOTENAME(Name) + ') as ' + Name
FROM DyTable
FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)'),1,2,'')
DECLARE @Sql NVARCHAR(MAX)
Select @Cols
SET @Sql = 'Select '+ @Cols1 +'
from (SELECT ' + @Cols + '
FROM DyTable t
PIVOT (MAX(Value)
FOR Name
IN (' + @Cols + ')
)P)a'
EXECUTE sp_executesql @Sql