Display 12 months of data from the past 5 years

时间:2016-10-20 20:07:44

标签: sql sql-server

I am currently creating a script that will pull 5 years of invoice data and will summarize the invoice amounts by month of that year for a specific customer. Example

Year  jan  feb mar 
2011  800  900 700
2012  700  800 900, and so forth

I am having issues getting my output to be like this though. My current code

    select MAX(cust) as customer,year(invoicedate) as y, month(invoicedate) as    m, sum(amount) as summary
          from #tquery   
          group by year(dinvoice), month(dinvoice)
          having MAX(ccustno) ='WILLAMETTE'
          order by y asc,m asc

          select * from #tquery

gives me this. which i just need to find a way to reformat it.

customer    year   month  amount
WILLAMETTE  2012    11     500
WILLAMETTE  2012    12     600
WILLAMETTE  2013    1     600

3 个答案:

答案 0 :(得分:1)

No need to go through a Pivot. It is only 12 columns. A conditional aggregation would be more efficient

 Select Customer = cust
       ,Year     = year(invoicedate) 
       ,Jan      = sum(case when  month(invoicedate) = 1 then amount else 0 end)
       ,Feb      = sum(case when  month(invoicedate) = 2 then amount else 0 end)
       ...
       ,Dec      = sum(case when  month(invoicedate) =12 then amount else 0 end)
 From  #tquery   
 Group by ccustno,year(dinvoice)
 Order By 1,2

答案 1 :(得分:0)

You must using PIVOT to reformat rows to column

答案 2 :(得分:0)

select      customer
           ,y
           ,"1","2","3","4","5","6","7","8","9","10","11","12"

from       (select      cust as customer,year(invoicedate) as y, month(invoicedate) as m,amount
            from        #tquery   
            where       ccustno ='WILLAMETTE'
            )
            t

            pivot (sum (amount) for m  in ("1","2","3","4","5","6","7","8","9","10","11","12")) p

order by    y
;