문제

다음 표를 만들었습니다 (Union All을 통해).

ID        Date         Hour   Weight    Fiscal
AAA       1/27/2009     0      10         0
AAA       1/30/2009     0      20         0
AAA       2/14/2009     0      10         0
AAA       2/18/2009     0      20         0
AAA       2/27/2009     0      20         0
AAA       2/28/2009     0      20         0
AAA       1/14/2009     10     0          0
AAA       2/14/2009     20     0          0
AAA       2/16/2009     10     0          0
AAA       2/25/2009     10     0          0
AAA       2/26/2009     10     0          0
AAA       3/3/2009          20     0          0
NULL          0                 0      0          1/28/2009
NULL          0                 0      0          2/27/2009
NULL          0                 0      0          3/29/2009

그리고 나는 회수하고 싶습니다 :

    ID      Date        Hour    Weight
    AAA     1/28/2009   10  10
    AAA     2/27/2009   50  50
    AAA     3/29/2009   20  20

먼저 날짜 열을 다음 회계 연도 말 회계 회계 회계 연도 (예 : 1/27/28/2009, 1/28/2009-> 2/27/2009 등으로 변환 한 다음 그룹을 그룹화해야합니다. 그 가치.

나는 사용할 수 있었다 :

    SELECT  ID
    ,       left(CONVERT(VARCHAR(10)
    ,       date, 111),7) as Date
    ,       round(sum(Hours),0) as Hours
    ,       round(sum(Weight),0) as Weight
    FROM    ...
    GROUP   BY ID
    ,       left(CONVERT(VARCHAR(10), date, 111),7)
    ORDER   by ID ASC
    ,       left(CONVERT(VARCHAR(10), date, 111),7) ASC

그러나 그것은 단지 그룹에 의해 단지 달력 날짜, 회계 월말에 따르면 내가 회계 열.

도움이 되었습니까?

해결책

재정 날짜를 테이블에 통합해서는 안됩니다. 그러나 현재 테이블을 사용하면 회계 '기간'과 함께 테이블을 만들 수 있으므로 (특별 특권이 필요하지 않음) 메인 테이블과 함께이 테이블에 참여할 수 있습니다.

나는 당신의 테이블이라고 불렀습니다. 또한 Oracle에서는 적어도 날짜가 예약 된 단어이기 때문에 열의 이름을 Chour and Cdate로 바꿔야했습니다. 당신은 아마도 '메인'테이블과 소스 테이블에서 직접 '회계'를 만들어 속도를 높일 수 있습니다.

with fiscal_part as (
            select fiscal
            from   SO
            where  fiscal is not null)
,    fiscal as (
            select fb.fiscal         fiscal_begin
            ,      min(fe.fiscal)    fiscal_end
            from   fiscal_part fb right join 
                   fiscal_part fe
                on fe.fiscal > fb.fiscal
            group by fb.fiscal)
,    main as (
            select *
            from   SO
            where  fiscal is null)
select main.ID
,      fiscal.fiscal_end
,      sum(main.cHour)
,      sum(main.weight)
from   main
join   fiscal on main.cdate >= coalesce(fiscal.fiscal_begin, main.cdate)
             and main.cdate <  fiscal.fiscal_end
group by main.ID
,      fiscal.fiscal_end
order by fiscal.fiscal_end

또한 샘플 데이터에는 오류가 있습니다. 마지막 기간의 무게는 40이어야합니다 (날짜가 2/27 및 2/28로있는 행).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top