Reputation: 55
I have a view in SQL server 2012 which displays the transactions of some items as follows:
Items transactions simplified view sample
I need to display sum of total cost (quantity multiplied by cost) for each item in each month and display months as columns like the following
Upvotes: 0
Views: 100
Reputation: 228
Try this.
SELECT * FROM (SELECT
SUM(Cost) AS Cost,
CONVERT(VARCHAR(3), DATENAME(MONTH, DATEADD(MONTH, MONTH(MonthCol), - 1))) MonthCol
FROM myTable WHERE YEAR(MonthCol) = 2016
GROUP BY MonthCol) AS TP
PIVOT (SUM(Cost) FOR MonthCol IN ([Jan], [Feb], [Mar], [Apr], [May], [Jun], [Jul], [Aug], [Sep], [Oct], [Nov], [Dec])) AS PVTTable
For Dynamic Query Month and Year
DECLARE @CurrMonth DATE = GETDATE();
DECLARE @CurrYear NVARCHAR(4) = CAST(YEAR(@CurrMonth) AS NVARCHAR(4))
DECLARE @END_MM INT = MONTH(@CurrMonth) --Current Month
DECLARE @START_MM INT = 1 --Start Month of Current Year
DECLARE @TB_DATE AS TABLE
(
ID INT IDENTITY(1,1),
DATE_LIST VARCHAR(12)
)
WHILE @START_MM <= @END_MM
BEGIN
INSERT INTO @TB_DATE (DATE_LIST) VALUES ('['+CONVERT(VARCHAR(3),DATENAME(MONTH, DATEADD(month, @START_MM-1, CAST(@END_MM AS datetime))))+']')
SET @START_MM=@START_MM+1
END
DECLARE @MM_LIST NVARCHAR(MAX) = (SELECT STUFF((SELECT ',' + DATE_LIST
FROM @TB_DATE ORDER BY ID DESC
FOR XML PATH('')) ,1,1,'') AS Txt)
DECLARE @DynamicPivot AS NVARCHAR(MAX)
SET @DynamicPivot = N'SELECT * FROM (SELECT
ItemId,
ItemName,
SUM(TotalCost) AS TotalCost,
CONVERT(VARCHAR(3),
DATENAME(MONTH, DATEADD(MONTH, MONTH(TransDate), - 1))) TransDate
FROM myTable WHERE YEAR(TransDate) = '+@CurrYear+'
GROUP BY TransDate,ItemId,ItemName) AS TP
PIVOT (SUM(TotalCost) FOR TransDate IN ('+@MM_LIST+')) AS PVTTable';
EXEC sp_executesql @DynamicPivot
Upvotes: 1