회계 월말까지 날짜와 그룹 변경
문제
다음 표를 만들었습니다 (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로있는 행).
제휴하지 않습니다 StackOverflow