質問: sql構文を手助けしてください (1)のようなテーブルデータを(2)のように表示したいと思います。 aa,bb,cc,dd,eeは列名としてください。 (1) aa bb cc dd ee __________________________ 00 01 2004/01/01 xx yy 01 00 2004/01/01 xe yd 01 00 2004/01/05 xz yz 02 01 2004/01/10 x2 ye 02 02 2004/01/05 xw yi 02 02 2004/01/06 xf yl (2) aa bb cc dd ee __________________________ 00 01 2004/01/01 xx yy 01 00 2004/01/05 xz yz 02 01 2004/01/10 x2 ye 02 02 2004/01/06 xf yl <条件> aaとbbでキーを作り、ccのmaxの該当レコードを表示したい。 select aa,bb,max(cc),dd,ee from test_table group by aa,bb というような感じかなと思ったのですが、「group by の式ではありません」と怒られてしまいます。 どなたか簡単なやり方をご存知で無いでしょうか?
回答: そのselect文、根本的に、条件に無理があります。条件が足りないというか・・・ たとえば、元テーブルの、aa,bb = 01,00 の所を例に取りましょう。該当するレコードは、2件あります。ccの最大値は、明確に定義されていますから、簡単です。2004/01/05です。 ところで、このとき、dd,eeは、いったい何になるんでしょうか?(2)のテーブルでは、xz,yzとなっていますが、これはなぜですか?なぜ、xe,ydではないのですか?と、まぁこういう事をデータベースは問いかけています。 そう。dd,eeに対する条件が足りないんです。「group byの式ではありません。」と言うのは、そういう意味です。 基本的に、group byを指定した場合は、selectの列リストには、group byに列挙された式と集合関数しか書けません。文法的に言うとこうなります。 ccがmaxの列のddとeeとなると、少々面倒です。 ここで、新しい条件として、aa,bb,ccの組みは、一意のキーを構成するという条件を付けます。でないと、一つのaa,bb,ccに対して、複数の列が該当すると言うことになり、さっきの話がぶり返しますので。 わかりやすい方法としては、viewを作っちゃうことでしょうか。 create view test_table_m (aa,bb,ccm) as select aa,bb,max(cc) from tast_table group by aa,bb として、viewを定義し、このテーブルと結合します。 create aa,bb,ccm,dd,ee from test_table a, test_table_m m where a.aa=m.aa and a.bb=m.bb and a.cc=m.ccm といったところでしょうか。 viewを作りたくないのであれば、サブクエリーで条件を書くことになりますが、なんだか、条件が結構、長くなりそうです。「簡単な」とはいいがたくなります。