2013-10-31 55 views
2

我有一个EventLogs表,它记录了Event的详细信息,例如事件的日期和费用。SQL postgres聚合/数据透视周数总计

+------+----------+---------------------------+-------------------+ 
| id | place_id | start_at     | total_fee_pennies | 
+------+----------+---------------------------+-------------------+ 
| 4242 | 40  | 2013-10-20 19:00:00 +0100 | 8700    | 
| 4288 | 48  | 2013-10-22 20:00:00 +0100 | 8000    | 
| 4228 | 141  | 2013-10-17 19:30:00 +0100 | 20000    | 
| 4232 | 19  | 2013-10-20 19:30:00 +0100 | 8000    | 
| 4239 | 5  | 2013-10-20 19:30:00 +0100 | 6800    | 
| 4269 | 6  | 2013-10-20 20:00:00 +0100 | 7000    | 
| 4234 | 98  | 2013-10-20 20:00:00 +0100 | 6900    | 

我希望能够按周汇总此数据总费用,我相信这是一个PIVOT?

所以我会选择在这些特定的月份:

"SELECT \"event_logs\".* FROM \"event_logs\" WHERE (event_logs.start_at BETWEEN '2013-10-01' AND '2013-10-31')" 

然后以某种方式通过不同place_id和周使用start_at与总费用为它们聚集(5周月,通常是?)每周。

place_id,每周1次,week2,...

但我不知道如何做到这一点?

回答

2

在这里您可以找到how to extract the week number。然后在CASE语句

SQLFiddle demo

WITH T AS 
(
SELECT 
EventLogs.* 
, 
extract(week from start_at) - 
extract(week from date_trunc('month', start_at)) + 1 as WeekNo 


FROM EventLogs 
WHERE (start_at BETWEEN '2013-10-01' AND '2013-10-31') 
) 

SELECT 
place_id, 
SUM(CASE WHEN WeekNo=1 THEN total_fee_pennies ELSE 0 END) as Week_1, 
SUM(CASE WHEN WeekNo=2 THEN total_fee_pennies ELSE 0 END) as Week_2, 
SUM(CASE WHEN WeekNo=3 THEN total_fee_pennies ELSE 0 END) as Week_3, 
SUM(CASE WHEN WeekNo=4 THEN total_fee_pennies ELSE 0 END) as Week_4, 
SUM(CASE WHEN WeekNo=5 THEN total_fee_pennies ELSE 0 END) as Week_5 

from T 

GROUP BY place_id 
+0

真棒,那伟大工程使用的周数。最后一个问题,关于像2月这样只有4周的月份? – ere