Reputation: 177
i have a problem with pivot table in SQL Server:
I have a table with the next information (i dont know how much different values could have 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
I want to transform this into a pivot table to get the next output:
product_4 product_6 product_8 ... product_x
1 10 100 1
2 20 200 2
3 30 300 3
I was using the next query:
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;
But the ouput is not that i expected...
PRODUCT_4 PRODUCT_6 PRODUCT_8 PRODUCT_X
3 30 300 3
My question is... how can i get all the values without using the aggregate function MAX?
Thanks all!
Upvotes: 0
Views: 109
Reputation: 1
Try this/ Or something along these lines.
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
Hope this helps. Thanks.
Upvotes: 0
Reputation: 1385
add ROW_NUMBER()
to your dynamic pivot:
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;
Upvotes: 2
Reputation: 67311
You must add a changing column to your query, I do this with ROW_NUMBER()
:
Just try it out:
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:
The result
+----------+-----------+-----------+-----------+-----------+
| ValueInx | PRODUCT_4 | PRODUCT_6 | PRODUCT_8 | PRODUCT_X |
+----------+-----------+-----------+-----------+-----------+
| 1 | 1 | 10 | 100 | 1 |
+----------+-----------+-----------+-----------+-----------+
| 2 | 2 | 20 | 200 | 2 |
+----------+-----------+-----------+-----------+-----------+
| 3 | 3 | 30 | 300 | 3 |
+----------+-----------+-----------+-----------+-----------+
You will easily integrate this into your dyanmic approach...
Upvotes: 2