Reputation: 7218
I'm having trouble figuring out how to construct the PIVOT
for my revenue query.
First, here's my query:
SELECT DATENAME(month,
CONVERT(DATETIME, CONVERT(VARCHAR, TransactionMonth) + '/1'
+ '/2013')) AS MONTH ,
RevenueGroup ,
AMOUNT
FROM ( SELECT f.TransactionMonth ,
f.RevenueGroupID ,
'$'
+ CONVERT(VARCHAR, CAST(SUM(f.LineItemAmount) AS MONEY), -1) AS Revenue ,
MIN(f.RevenueGroup) AS RevenueGroup
FROM Financials(@StartDate, @EndDate, @SiteID) f
GROUP BY f.TransactionMonth ,
f.RevenueGroupID
) AS Rev
ORDER BY Rev.TransactionMonth DESC ,
CAST(Revenue AS MONEY) DESC
And here is my result set:
MONTH RevenueGroup AMOUNT
December Dues - Collect $425,725.71
December NMS $78,444.17
December Personal Training $58,511.53
November Dues - Collect $425,683.75
November NMS $114,710.25
November Personal Training $66,277.49
October Dues - Collect $419,250.09
October NMS $96,098.86
October Personal Training $58,725.77
And here is how the result set needs to look after the sql PIVOT:
RevenueGroup DECEMBER NOVEMBER OCTOBER
Dues - Collect $425,725.71 $425,683.75 $419,250.09
NMS $78,444.17 $114,710.25 $96,098.86
Personal Training $58,511.53 $66,277.49 $58,725.77
How can I achieve this with T-SQL PIVOT?
Upvotes: 3
Views: 2559
Reputation: 2785
This already has a best answer and this is not meant to be an answer, but an addendum hint on how to capture the dynamic months for the dynamic SQL...
Declare @dynamicColumns Nvarchar(64)
Select @dynamicColumns = Coalesce(@dynamicColumns + ',','') + '[' + m.months + ']'
From (Select 0 As monthSubtract
Union
Select 1
Union
Select 2) As ms
Cross Apply (Select DateName(MONTH,DATEADD(MONTH, -ms.monthSubtract, GETDATE())) As months) m
Order By ms.monthSubtract Desc
Select @dynamicColumns
Upvotes: 1
Reputation: 69524
Test Data
CREATE TABLE #MyTable ([MONTH] NVARCHAR(20),RevenueGroup NVARCHAR(100),AMOUNT NUMERIC(20,2))
GO
INSERT INTO #MyTable
VALUES
('December','Dues - Collect', 425725.71),
('December','NMS', 78444.17),
('December','Personal Training', 58511.53),
('November','Dues - Collect', 425683.75),
('November','NMS', 114710.25),
('November','Personal Training', 66277.49),
('October','Dues - Collect', 419250.09),
('October','NMS', 96098.86),
('October','Personal Training', 58725.77)
Query
SELECT RevenueGroup, [October],[November],[December]
FROM (SELECT * FROM #MyTable)t --<-- Your Existing Query can go in here but do not
PIVOT -- not do any formating like Dollar sign as you want
( -- sum the results by month later on
SUM(AMOUNT)
FOR [MONTH]
IN ([October],[November],[December])
)P
Result
╔═══════════════════╦═══════════╦═══════════╦═══════════╗
║ RevenueGroup ║ October ║ November ║ December ║
╠═══════════════════╬═══════════╬═══════════╬═══════════╣
║ Dues - Collect ║ 419250.09 ║ 425683.75 ║ 425725.71 ║
║ NMS ║ 96098.86 ║ 114710.25 ║ 78444.17 ║
║ Personal Training ║ 58725.77 ║ 66277.49 ║ 58511.53 ║
╚═══════════════════╩═══════════╩═══════════╩═══════════╝
Upvotes: 8