2016-10-25 2 views
0

저는 하루에 주문한 주문에서 시작하여 데이터 테이블의 각 날에 대해 4 일에서 180 일 동안 주문한 주문을 기반으로 고유 한 집계와 총 판매액을 작성하기 위해 노력했습니다. 181, 다음 월별로 그룹화 & 년,하지만 그것을 할 수 없습니다.오프셋 롤링 합계 및 개수에 대한 쿼리 - 오라클 SQL

최종 결과는 아래 표와 같습니다. 각 주문은 최대 176 번까지 여러 번 표시되지만 주어진 날짜에는 별개입니다 (주문 42999, 2010 년 10 월 1 일에 배치됨). 예를 들어 10-05-2011과 2 일 사이에 매일 한 번 계산됩니다. 예를 들어 01-2012)

| OrdMonthYr | Grouped Order Count | Sum of Orders | 
------------------------------------------------------ 
| 2011-06 |  140    |  $450  | 
| 2011-07 |  190    |  $500  | 
| 2011-08 |  250    |  $600  | 
------------------------------------------------------ 

그 날 4 180 일 전 (3 월 1 일, 그래서 2011 별개의 순서가 계산 및 주문했을 실행 주어진 하루 판매의 총 개수를 취할 것입니다 주문 수 2010 년 11 월 1 일부터 2011 년 2 월 25 일 사이에 발주 된 주문의 합계)에 이어 월별 & 년까지 합계를 합산하는 기능이 있습니다.

답변

1

난 당신이 누적 합계를 얻을 4에서 180 그러나에 이전 일 동안 계산하려는 알고있는 것처럼 그 그래서 당신은 분석 함수를 사용할 수있는 경우가 겹쳐서되어야하는지 명확하지 않다. 다음 쿼리에서 계산합니다.

select trunc(o.orderdate) 
     ,count(*) over (order by trunc(o.orderdate) range between 180 PRECEDING AND 4 PRECEDING) 
     ,sum(amount) over (order by trunc(o.orderdate) range between 180 PRECEDING AND 4 PRECEDING) 
    from orders o 

주문을 한 달에 롤업하는 방법은 무엇입니까? 매월 1 일에 합계 금액을 받으면 이전 쿼리에서 매달 한 행씩 가져올 수 있습니다.

select ord_date, cnt,sum_amount FRoM (
select trunc(o.orderdate) as ord_date 
     ,count(*) over (order by trunc(o.orderdate) range between 180 PRECEDING AND 4 PRECEDING) as cnt 
     ,sum(amount) over (order by trunc(o.orderdate) range between 180 PRECEDING AND 4 PRECEDING) as sum_amount 
     ,row_number() over (order by trunc(o.orderdate),rowid) as RN 
    from orders o) 
WHERE rn = 1 
    and ord_date = trunc(ord_date,'MM') 
+0

나는 일일 카운트를 4 일에서 180 일 이전에 월 및 연도별로 롤백하고 싶다. – Danimov82

+0

아직 명확하지 않지만 예를 들어 2016 년 1 월에 우리가 고려해야 할 명령이 있습니다. 2014 년 5 월 5 일부터 2016 년 10 월 28 일까지 또는 2017 년 5 월 5 일부터 2016 년 2 월 28 일까지 모든 주문을 접수해야하며 2015 년 6 월 29 일부터 29 일까지 모든 주문을 받아야합니다. -dec-2016 (02-Jan-2016 ... 31-Jan-2016) –

+0

3 월 1 일에는 2014 년 5 월 28 일에서 2016 년 5 월 5 일까지 걸릴 것입니다. 3 월 2 일은 2014 년 6 월 20 일부터 2016 년 29 월 20 일까지 진행되며 3 월 한 달 동안 계속됩니다. 그럼 우리는 매월 합계를 합산합니다. – Danimov82

0

원하는대로 되나요?

select orderdate, 
     (select count(*) 
     from orders o 
     where o.orderdate between d.dte - 180 an d.dte - 4 
     ) as cnt, 
     (select sum(amount) 
     from orders o 
     where o.orderdate between d.dte - 180 an d.dte - 4 
     ) as amount 
from (select distinct orderdate as dte from orders) d; 
+0

범위는 4 일에서 180 일이되어야합니다. 그것은 (d.dte-4)와 (d-dte-180)입니까? – Danimov82

+0

@ Danimov82. . . 아, 이제 그게 맞는 지 알 수 있습니다. –

+0

그래서 주문 번호와 총 주문 금액의 합계가 계산됩니다. – Danimov82