このディレクトリの索引

# 出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/493 # SQLServer2008R2です. # テーブルデータはDATE(YYYYMMの6けたのint型),CODE(varchar型),VALUE(float型) # の3カラムからなります.各DATEの各CODEに対して過去3か月分の総和を算出したいと思います. # 元テーブル # DATE, CODE, VALUE # .... # 200101, AAA, 1 # 200102, AAA, 2 # 200103, AAA, 3 # 200104, AAA, 4 # 200101, BBB, 1 # .... # # 欲しい結果 # 200103, AAA, 6 # 200104, AAA, 9 # ....... # # 下記のようなSQLを書いたのですが,同じ結果の行が12か月分でてきます. # 何処を修正すればよろしいでしょうか?もしくは全然違うSQLでしょうか? # # SELECT A.DATE, A.CODE, SUM(B.VALUE) OVER (PARTITION BY B.DATE, B.CODE) # FROM TABLE A, TABLE B # WHERE A.CODE=B.CODE AND B.DATE>=A.DATE AND B.DATE>=(A.DATEの3か月前←計算式が長いので省略です) # ORDER BY A.DATE, A.CODE # # よろしくお願いいたします. # 'A'(200101,'AAA',1). 'A'(200102,'AAA',2). 'A'(200103,'AAA',3). 'A'(200104,'AAA',4). 'A'(200101,'BBB',1). 過去三ヶ月の集計(_過去三ヶ月の集計ならび) :- '_DATE,_CODEを鍵として、過去三ヶ月の_VALUEの集計'(_過去三ヶ月の集計ならび). '_DATE,_CODEを鍵として、過去三ヶ月の_VALUEの集計'(_過去三ヶ月の集計ならび) :- '_DATE,_CODEを鍵とする'(_DATE_CODEならび), findall([_DATE,_CODE,_集計],( '過去三ヶ月の全ての_DATE,_CODEに対して、_VALUEを集約する'(_DATE,_CODE,_DATE_CODEならび,_集計)),_過去三ヶ月の集計ならび). '_DATE,_CODEを鍵とする'(_DATE_CODEならび) :- setof([_DATE,_CODE],[_DATE,_CODE,_VALUE] ^ 'A'(_DATE,_CODE,_VALUE),_DATE_CODEならび). '過去三ヶ月の全ての_DATE,_CODEに対して、_VALUEを集約する'(_DATE,_CODE,_DATE_CODEならび,_集計) :- member([_DATE,_CODE],_DATE_CODEならび), '過去三ヶ月の_DATE,_CODEで_VAULEを集約'(_DATE,_CODE,_集計). '過去三ヶ月の_DATE,_CODEで_VAULEを集約'(_DATE,_CODE,_集計) :- '3ヶ月前の起点月'(_DATE,_3ヶ月前の起点月), findsum(_VALUE,( テーブルデータは過去三ヶ月の範囲内(_DATE,_CODE,_3ヶ月前の起点月,_VALUE)),_集計). テーブルデータは過去三ヶ月の範囲内(_DATE,_CODE,_3ヶ月前の起点月,_VALUE) :- 'A'(_DATE_1,_CODE,_VALUE), between(_3ヶ月前の起点月,_DATE,_DATE_1). '3ヶ月前の起点月'(_今月,_3ヶ月前の起点年月) :- 今月が1月から3月の範囲では前年となる(_今月,_3ヶ月前の起点年月),!. '3ヶ月前の起点月'(_今月,_3ヶ月前の起点年月) :- 今月が4月から12月の範囲では今年となる(_今月,_3ヶ月前の起点年月). 今月が1月から3月の範囲では前年となる(_今月,_3ヶ月前の起点月) :- M is _今月 mod 100, M =< 3, _3ヶ月前の起点月 is _今月 - 100 + 9. 今月が4月から12月の範囲では今年となる(_今月,_3ヶ月前の起点月) :- _3ヶ月前の起点月 is _今月 - 3. findsum(A,B,C) :- findall(A,B,L), sum_list(L,C).