Leonardo
Leonardo

Reputation: 11381

How to pivot this particular query

Given the Script/Data

CREATE TABLE #DemoData
(
    Name varchar(50),
    Billing money,
    Comission money,
    Month varchar(10)
)

insert into #DemoData
VALUES ('Lílian Araújo Albernaz',4308.00,1271.60,'August'),
('Lílian Araújo Albernaz',3254.00,898.75,'December'),
('Lílian Araújo Albernaz',5792.00,1711.89,'July'),
('Lílian Araújo Albernaz',6062.50,1626.18,'November'),
('Lílian Araújo Albernaz',6681.00,1893.06,'October'),
('Lílian Araújo Albernaz',6102.00,1796.34,'September'),
('Leicy Araujo Albernaz',2668.00,2114.92,'August'),
('Leicy Araujo Albernaz',1200.00,950.33,'December'),
('Leicy Araujo Albernaz',3152.50,2498.87,'July'),
('Leicy Araujo Albernaz',2558.00,2030.05,'November'),
('Leicy Araujo Albernaz',2845.00,2251.37,'October'),
('Leicy Araujo Albernaz',3050.00,2417.33,'September'),
('Núbia Nicacio Brito',2309.00,1828.60,'August'),
('Núbia Nicacio Brito',1050.00,828.39,'December'),
('Núbia Nicacio Brito',1977.50,1564.32,'July'),
('Núbia Nicacio Brito',1995.00,1577.34,'November'),
('Núbia Nicacio Brito',2414.00,1908.87,'October'),
('Núbia Nicacio Brito',2575.00,2034.45,'September'),
('Sonia Caxeta',1507.00,1188.02,'August'),
('Sonia Caxeta',900.00,706.99,'December'),
('Sonia Caxeta',1988.00,1571.72,'July'),
('Sonia Caxeta',1655.00,1304.71,'November'),
('Sonia Caxeta',1857.00,1463.44,'October'),
('Sonia Caxeta',2013.00,1587.93,'September'),
('Mirian Pinto Rabelo',1020.00,454.67,'August'),
('Mirian Pinto Rabelo',800.00,359.84,'December'),
('Mirian Pinto Rabelo',1135.00,518.28,'July'),
('Mirian Pinto Rabelo',1000.00,443.42,'November'),
('Mirian Pinto Rabelo',2020.00,911.13,'October'),
('Mirian Pinto Rabelo',1415.00,625.48,'September'),
('Cleuza',2683.00,1277.25,'August'),
('Cleuza',1530.00,688.70,'December'),
('Cleuza',2012.00,984.47,'July'),
('Cleuza',2790.00,1311.74,'November'),
('Cleuza',2298.00,1099.48,'October'),
('Cleuza',2160.00,1048.80,'September'),
('Nivia Santos Caldeira Alves',80.00,38.97,'October'),
('Thais Pereira da Cruz',449.00,357.43,'December'),
('Thais Pereira da Cruz',227.00,179.02,'November'),
('Geisiane Araujo Amparo',305.00,145.03,'December')

how can I pivot this table so I get:

NAME   | Month 1 | Month 2 | ... | Month N
Lilian    100       200              300
Janeth    10        NULL             NULL
Dorias    300       200              NULL

EG: I get one line for Billing and one line for commission...

PS: Given time sensitivity, I can do with 2 queries, one for billing and another for commission

EDIT1
The query I have so far:

DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(MES)
                from #DemoData
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

set @query = 'SELECT Name,' + @cols + ' 
        from 
        #DemoData AS p
        pivot 
        (
            SUM(p.Billing)
            for p.Month in (' + @cols + ')
        ) AS p'
        --GROUP BY Name,'+@cols

 execute sp_executesql @query;

Upvotes: 0

Views: 41

Answers (1)

John Cappelletti
John Cappelletti

Reputation: 81970

Here is a quick pivot for billing. (It would be a small matter to make it dynamic and have both billing and commission as columns or even rows)

Select [Name],[Month 01],[Month 02],[Month 03],[Month 04],[Month 05],[Month 06],[Month 07],[Month 08],[Month 09],[Month 10],[Month 11],[Month 12]
  From (
        Select [Name],[Billing],[Col] = Format(MM,'Month 00')
         From  #DemoData A
         Join (Select * From (Values(1,'January'),(2,'February'),(3,'March'),(4,'April'),(5,'May'),(6,'June'),(7,'July'),(8,'August'),(9,'September'),(10,'October'),(11,'November'),(12,'December')) Mths(MM,MMMM)) B
           on  A.Month=B.MMMM
       ) A
 Pivot (Sum([Billing]) For [Col] in ([Month 01],[Month 02],[Month 03],[Month 04],[Month 05],[Month 06],[Month 07],[Month 08],[Month 09],[Month 10],[Month 11],[Month 12]) ) p

Returns

enter image description here

EDIT - Dynamic Version

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(Col) 
                                    From (Select Distinct [Col] = Format(MM,'Month 00')
                                          From   #DemoData A
                                          Join (Select * From (Values(1,'January'),(2,'February'),(3,'March'),(4,'April'),(5,'May'),(6,'June'),(7,'July'),(8,'August'),(9,'September'),(10,'October'),(11,'November'),(12,'December')) Mths(MM,MMMM)) B
                                          on A.Month = B.MMMM  
                                         ) A Order by 1 For XML Path('')),1,1,'') 
Select  @SQL = '
 Select [Name],' + @SQL + '
  From (
        Select [Name],[Billing],[Col] = Format(MM,''Month 00'')
         From  #DemoData A
         Join (Select * From (Values(1,''January''),(2,''February''),(3,''March''),(4,''April''),(5,''May''),(6,''June''),(7,''July''),(8,''August''),(9,''September''),(10,''October''),(11,''November''),(12,''December'')) Mths(MM,MMMM)) B
           on  A.Month=B.MMMM
       ) A
 Pivot (Sum([Billing]) For [Col] in (' + @SQL + ') ) p'
Exec(@SQL);

Returns

enter image description here

Upvotes: 2

Related Questions