2013-10-31 3 views
2

이벤트 및 요금과 같은 주어진 이벤트의 세부 정보를 기록하는 테이블 EventLog가 있습니다.합계가있는 SQL 포스트그레스 집계/데이터 피벗

+------+----------+---------------------------+-------------------+ 
| 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')" 

을 그리고 어떻게 든 start_at 사용하여 별개의 place_id에 의해 주별로 집계 총 수수료로 :

그래서 나는 주어진 달을 선택할 것 (보통 한 달에 5 주?) 매주.

place_id, 주 1, week2, ...

하지만이 작업을 수행하는 방법을 모르겠어요?

답변

2

여기서 how to extract the week number을 찾을 수 있습니다. 그런 훌륭한 작품을 경우 문

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

최고,의 주 번호를 사용합니다. 마지막 질문은 4 월 밖에 걸리지 않는 2 월과 같은 달에 관한 것입니까? – ere