2009年6月6日土曜日

最大値のレコードだけを集める

ある特定の項目の最大値にあたるレコードの集まりだけを取り出す。。。
単にMAX関数を使うだけではSQLは完成しない。。。
さらに、その最大値が日付だった場合、指定の日付を最大値とみなして抜き出すことをしようものなら、さらに工夫が必要だ。

そこで例題 本日が 2009年 4月1日として その日現在の集合を抜き出す。20000101~ 20041231 までは 10 200501001 ~ 20081231 までは 20というよな運用として
テーブル名 T
データ
FA       FB      FC
--------------------------------------------
abc      20000101     10
abc      20050101     20
abc      20090101     30
abc      20100101     40
def      20040401     50
def      20090331     60
def      20091231     70
def      20100101     80
ghi      20030501     90
ghi      20090501     100
ghi      20100501     110

結果
F1       F2      FC
--------------------------------------------
abc      20090101     30
def      20090331     60
ghi      20030501     90

SELECT Q1.F1, Q1.F2, T1.FC FROM T
AS T1 INNER JOIN
(SELECT FA AS F1,
 MAX(CASE WHEN FB >'20090401' THEN
 '00000000'
ELSE
 FB
END)
AS F2 FROM T
GROUP BY FA)
AS Q1
ON Q1.F1=T1.FA
AND Q1.F2=T1.FB

ポイントはサブクエリで指定の日付を超えた場合に'00000000'と変換する部分がポイント
尚、Micrsoft Access ではサポートをしていないらしいとのことで、エラーが発生
ちなみに CASE を使用する場合には Accessでは IIf を使用する。
Accessではストアドをキックしてレコードを抜き出した方がよさそうである

0 件のコメント: