2009-06-25 18 views
0

私は(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/2007 - > 1/28/2009、1/30/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 

しかしカレンダー日付によってそのちょうどグループは、財政月に応じて、私は年度列に持って終了していません。

+0

ここではどのDBエンジンを使用していますか?また、最初の出力を返すSQLをポストすることもできます。 –

+0

この質問を明確にする必要があります。上記の表のFiscalは最初の12個のエントリが0なので、これらの日付はどのように計算されますか?時間と重量は何らかの形で会計月の計算に関係していますか? 1行を計算するために複数の行を結合していますか(実際の会計月を決定するために複数の行にAAAエントリを追加するなど)基本的な問題を減らしてください。 – razzed

+0

最初のステップは、データを2つの別々のテーブルに取得することです。 2番目の表に会計年度を表し、それぞれに開始日と終了日を指定します。上のUNION ALLの混乱からそれを並べ替えることは、愚かです。そのテーブルを使用することで、グループ化はかなり簡単になります。あなたは財政の終わりまでにグループ化し、 '財政的なstart_andartとfiscal_end'の間に 'dateval'で参加します。 BETWEEN/ANDの包括的な範囲がここで非常に役立ちます。 –

答えて

1

あなたはあなたのテーブルに年度日を組合わせるべきではありません。しかし今のようにテーブルを作成するには、最初にテーブルを作成し(WITHを使用するので、特別な権限は必要ありません)、会計期間と一緒にこのテーブルをメインテーブルと結合することができます。

私はあなたのテーブルを電話しました。 Oracleでは、少なくともDateは予約語なので、列の名前をcHourと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の行)。