我在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的情况下获得所有值?
全部谢谢!
答案 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
希望这会有所帮助。 感谢。