SQL将未知行查询到列中

时间:2014-04-14 12:38:58

标签: sql sql-server pivot

我问了这个问题,它被标记为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

这个问题似乎无法解决。

  1. 我不需要列标题和第一列中包含cols,Name,Value。
  2. 无法弄清楚如何为每行构建一列而不指定[x]标识符。
  3. 任何指导都会很棒我现在已经坚持了一段时间。

2 个答案:

答案 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