数据透视表具有多个x列的多个值

时间:2018-03-29 09:37:23

标签: sql-server tsql ssms

我在SQL Server中使用数据透视表时遇到问题:

我有一个包含下一个信息的表(我不知道有多少不同的值可能有column1):

Column1   Value
---------------
PRODUCT_4   1
PRODUCT_4   2
PRODUCT_4   3
PRODUCT_6   10
PRODUCT_6   20
PRODUCT_6   30
PRODUCT_8   100
PRODUCT_8   200
PRODUCT_8   300
...         ...
PRODUCT_X   1
PRODUCT_X   2
PRODUCT_X   3

我想将其转换为数据透视表以获取下一个输出:

product_4    product_6    product_8    ...    product_x
1            10           100                1
2            20           200                2
3            30           300                3

我正在使用下一个查询:

DECLARE 
@cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(column1) 
                    from dbo.Context_Table
                   group by column1
           FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')
print @cols

set @query = N'SELECT ' + @cols + N' from 
             (
                select value, Column1
                from dbo.Context_Table
            ) x
            pivot 
            (
                max(value)
                for Column1 in (' + @cols + N')
            ) p '

exec sp_executesql @query;

但是输出不是我预期的......

PRODUCT_4   PRODUCT_6   PRODUCT_8   PRODUCT_X
3           30          300         3   

我的问题是......如何在不使用聚合函数MAX的情况下获得所有值?

全部谢谢!

3 个答案:

答案 0 :(得分:2)

您必须在查询中添加更改列,我使用ROW_NUMBER()

执行此操作

试一试:

DECLARE @tbl TABLE(Column1 VARCHAR(100),[Value] INT)
INSERT INTO @tbl VALUES
 ('PRODUCT_4',1)
,('PRODUCT_4',2)
,('PRODUCT_4',3)
,('PRODUCT_6',10)
,('PRODUCT_6',20)
,('PRODUCT_6',30)
,('PRODUCT_8',100)
,('PRODUCT_8',200)
,('PRODUCT_8',300)
,('PRODUCT_X',1)
,('PRODUCT_X',2)
,('PRODUCT_X',3)

SELECT p.*
FROM
(
    SELECT ROW_NUMBER() OVER(PARTITION BY Column1 ORDER BY [Value]) AS ValueInx
          ,*
    FROM @tbl AS t
) AS tbl
PIVOT
(
    MAX([Value]) FOR Column1 IN(PRODUCT_4,PRODUCT_6,PRODUCT_8,PRODUCT_X)
) AS p:

结果

+----------+-----------+-----------+-----------+-----------+
| ValueInx | PRODUCT_4 | PRODUCT_6 | PRODUCT_8 | PRODUCT_X |
+----------+-----------+-----------+-----------+-----------+
| 1        | 1         | 10        | 100       | 1         |
+----------+-----------+-----------+-----------+-----------+
| 2        | 2         | 20        | 200       | 2         |
+----------+-----------+-----------+-----------+-----------+
| 3        | 3         | 30        | 300       | 3         |
+----------+-----------+-----------+-----------+-----------+

您可以轻松地将其整合到您的动态方法中......

答案 1 :(得分:2)

ROW_NUMBER()添加到您的动态支点:

 set @query = N'SELECT  ' + @cols + N' from 
         (
            select ROW_NUMBER() OVER (PARTITION BY Column1 ORDER BY value) RN , value, Column1
            from ##T
        ) x
        pivot 
        (
            max([value])
            for Column1 in (' + @cols + N')
        ) p '

 exec sp_executesql @query;

答案 2 :(得分:0)

尝试这个/或类似的东西。

select PRODUCT_4,PRODUCT_6,PRODUCT_8
from 
(select name,value,row_number() over (partition by name order by value) as id from product) p
pivot
(
    max(value)
    for name
    IN( PRODUCT_4,PRODUCT_6,PRODUCT_8)
)
as a

希望这会有所帮助。 感谢。