2011-07-28 2 views
1

PostgreSQL에서 일, 주, 월 등 판매 보고서를 작성해야합니다.COUNT 및 GROUP BY 시간이 지남에

tbl_products: 
    id INT 
    name VARCHAR 

tbl_purchase_order: 
    id INT 
    order_timestamp TIMESTAMP 

tbl_purchase_order_items: 
    id INT 
    product_id INT (FK to tbl_products.id) 
    order_id (FK to tbl_purchase_order.id) 

내가 주어진 제품이 주어진 시간 내에 구매 한 횟수를 반환하는 SQL 쿼리를 작성해야합니다 : 나는 다음과 같은 테이블 설정을 가지고있다. 즉, 특정 제품 ID가 특정 월, 일, 년 등의 구매 주문 항목에 나타나는 횟수를 쿼리해야합니다. 이전 질문에서 date_trunc()를 사용하여 TIMESTAMP 열을 자르는 방법을 배웠습니다. 내가 걱정할 시간이야. 이제 COUNT 및 GROUP BY를 올바르게 수행하는 방법에 직면했습니다.

다양한 조합의 COUNT (XXX)와 GROUP BY XXX을 (를) 사용하여 여러 가지 쿼리를 시도했지만 예상 한 결과를 얻지 못했습니다. 누군가이 쿼리를 작성하는 방법에 대한 지침을 줄 수 있습니까? 저는 Java 개발자가 많기 때문에 여전히 SQL 쿼리 속도가 빨라지고 있습니다. 제공 할 수있는 도움에 감사드립니다. 연간

답변

4

수 : 한달에

SELECT oi.product_id, 
     extract(year from po.order_timestamp) as order_year 
     count(*) 
FROM purchase_order_items oi 
    JOIN purchase_order po ON po.id = oi.order_id 
GROUP BY extract(year from po.order_timestamp) 

카운터 :

SELECT oi.product_id, 
     extract(month from po.order_timestamp) as order_month 
     extract(year from po.order_timestamp) as order_year 
     count(*) 
FROM purchase_order_items oi 
    JOIN purchase_order po ON po.id = oi.order_id 
GROUP BY extract(year from po.order_timestamp), 
     extract(month from po.order_timestamp) 
+0

그렇다면 왜 extract()를 사용하고 date_trunc()를 사용하고 '2011-06-01'로 끝나는 대신에 날짜 구성 요소를 사용 했습니까? 이런 식으로하는 것이 유익합니까? 행동이 다른가요? – Shadowman

+0

@Shadowman : 부분적으로 이것은 내 습관이기 때문에, 부분적으로 만 일년을 위해서 date_trunc()가 작업을 수행하지 않기 때문입니다. –

1

은 포스트 그레스의 날짜 기능을 참조하십시오 http://www.postgresql.org/docs/8.1/static/functions-datetime.html

난 당신이 올해 분할, 추출 기능을 사용하는 것이 좋습니다 것입니다 , 월 및 일을 결과 집합의 구분 된 열로 구분 한 다음 요구 사항에 따라 그룹화합니다.

+0

왜 날짜 구성 요소를 정확히 분리해야합니까? 왜 내가 찾고 있던 달이나 연도를 얻기 위해 date_trunc() 메서드를 사용할 수 없습니까? 그 차이가 무엇인지 궁금 하네. – Shadowman