HerrimanCoder
HerrimanCoder

Reputation: 7218

t-sql pivot - monthly revenue

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

Answers (2)

Eric J. Price
Eric J. Price

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

M.Ali
M.Ali

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

Related Questions