会計月の終わりごとに日付とグループを変更する
質問
次のテーブルを作成しました(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
まず、DATE列を次の会計年度末FISCALに変換する必要があります(たとえば、1/27/2007-<!> gt; 1/28 / 2009、1 / 30/2009-<!> gt; 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
ただし、 FISCAL 列にある会計月の終了日ではなく、カレンダーの日付ごとにグループ化します。
解決
会計年度をテーブルに統合しないでください。しかし、現在のテーブルでは、最初に会計の「期間」を持つテーブルを作成し(WITHを使用するため、特別な特権は必要ありません)、このテーブルをメインテーブルに結合できます。
私はあなたのテーブルをSOと呼びました。また、Oracleでは少なくともDateは予約語であるため、列の名前をcHourおよびCDateに変更する必要がありました。 おそらく、ソーステーブルからテーブル 'main'とテーブル 'fiscal'を直接作成して、速度を上げることができます。
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