2017-08-09 44 views
1

我想通过销售代表创建一个年度销售报告表,显示所有的十二个月。我有数据或多或少就像这个例子:Postgres通过代表查询年度销售报告。按月分组

id | rep | date  | price 
---------------------------- 
1 1  2017-01-01 20 
2 1  2017-01-20 44 
3 2  2017-02-18 13 
4 2  2017-03-08 12 
5 2  2017-04-01 88 
6 2  2017-09-05 67 
7 3  2017-01-31 10 
8 3  2017-06-01 74 

我需要会是这样的结果:

Rep Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 
---------------------------------------------------- 
1 64 0 0 0 0 0 0 0 0 0 0 0 
2 0 13 12 88 0 0 0 0 67 0 0 0 
3 10 0 0 0 0 74 0 0 0 0 0 0 

什么是写这个查询的最有效方法是什么?

回答

1

一种方法是使用窗口功能与FILTER

SELECT DISTINCT 
    "rep", 
    COALESCE(SUM(price) FILTER (WHERE extract('month' from "date") = 1) OVER(PARTITION BY "rep"),0) AS Jan, 
    COALESCE(SUM(price) FILTER (WHERE extract('month' from "date") = 2) OVER(PARTITION BY "rep"),0) AS Feb 
--.... 
FROM ta; 

Rextester Demo

警告!

你可能想通过YEAR太分区,以避免总结JAN 2017JAN 2018

2

单程:

select rep, 
sum(case when extract('month' from date) = 1 then price else 0 end) as Jan, 
sum(case when extract('month' from date) = 2 then price else 0 end) as Feb 
-- another months here 
from t 
group by rep