TABLE-1
OrderDate | CustomerNo | ProductId | Quantity |
---|---|---|---|
2021-03-01 | 1 | 1 | 10 |
2021-03-01 | 1 | 3 | 20 |
2021-03-02 | 1 | 2 | 15 |
2021-03-02 | 1 | 3 | 10 |
2021-03-03 | 1 | 1 | 10 |
2021-03-03 | 1 | 5 | 25 |
This table also contains data for other customers also Customers 2,3,4 …
TABLE-2
ProductId | ProductName |
---|---|
1 | P1 |
2 | P2 |
3 | P3 |
4 | P4 |
5 | P5 |
Products are not Fixed, may be added P6,P7 …
RESULT :
OrderDate | P1 | P2 | P3 | P4 | P5 |
---|---|---|---|---|---|
2021-03-03 | 10 | 25 | |||
2021-03-02 | 15 | 10 | |||
2021-03-01 | 10 | 20 |
I need this result , is this possible using Pivot / UnPivot
Advertisement
Answer
x
Here is the dynamic PIVOT for the query
DECLARE @SQL AS VARCHAR(MAX)
, @cols_ AS vARCHAR(MAX)
--Making the column list dynamically
SELECT @cols_ = STUFF((SELECT DISTINCT ', '+QUOTENAME( [T2].[ProductName])
FROM [TABLE_2] [T2]
FOR XML PATH('')), 1, 1, '')
print @cols_
--preparing PIVOT query dynamically.
SET @SQL = ' SELECT
pivoted.*
into #Temp_data
FROM
(
SELECT
[T1].[OrderDate],
[T2].[ProductName],
SUM([T1].[Quantity] ) AS [Quantity]
FROM [TABLE_1] [T1]
INNER JOIN [TABLE_2] [T2]
ON [T1].[ProductId] = [T2].[ProductId]
GROUP BY [T1].[OrderDate],
[T2].[ProductName]
) AS [p]
PIVOT
(
MIN([P].[Quantity])
FOR [P].[ProductName] IN (' + @cols_ + ')
) AS pivoted;
select *
from #Temp_data [B]
-- GROUP BY [B].[OrderDate]
drop table #Temp_data
';
PRINT( @SQL)
EXEC (@SQL)
Result: Dynamic PIVOT