FirebirdでSQL文を扱ってます。
TABLE1
TITLE_NO(SMALLINT)(キー)
TITLE (VARCHAR(40) )
ALBUM_NO(SMALLINT)
POINT (SMALLINT)
TABLE2
ALBUM_NO(SMALLINT)(キー)
ALBUM (VARCHAR(20) )
TABLE2のALBUMを、TABLE1のPOINTごとに表示させたいと思ってます。
日本語があやふやですいません。
こんな感じを目指してます。
ALBUM POINT=1 POINT=2 POINT=3
AAA ××個 ○○個 △△個
BBB ・・・ ・・・ ・・・
CCC ・・・ ・・・ ・・・
1列限定(例えばPOINT=1のみ)ならうまくできたのですが、
それが複数となるとどう書けばよいのか分かりません。
どなたかお教え願います。
以下のSQLはPOINTが少ない場合ならどうにかなると思いますが,
POINTの数が多くなればなるほどSQLが長くなってしまいます。
他に良いSQLあれば良いんですが,私にはちょっとわかりません。
SELECT
TABLE1.ALBUM_NO, TABLE2.ALBUM,
SUM(CASE WHEN TABLE1.POINT = 1 THEN TABLE1.POINT ELSE 0 END) AS POINT1,
SUM(CASE WHEN TABLE1.POINT = 2 THEN TABLE1.POINT ELSE 0 END) AS POINT2,
SUM(CASE WHEN TABLE1.POINT = 3 THEN TABLE1.POINT ELSE 0 END) AS POINT3
FROM
TABLE1
LEFT JOIN TABLE2 ON TABLE1.ALBUM_NO = TABLE2.ALBUM_NO
POINT1,POINT2...というフィールド名はプログラムの中で
作らなければいけませんが、こんなやり方はどうでしょうか?
select
POINT,
sum (POINT)
from
TABLE1 LEFT JOIN TABLE2 ON
TABLE1.ALBUM_NO = TABLE2.ALBUM_NO
group by
POINT
Ruさん、かふぇさん、ありがとうございます。
Ruさんの
SELECT
TABLE1.ALBUM_NO, TABLE2.ALBUM,
SUM(CASE WHEN TABLE1.POINT = 1 THEN TABLE1.POINT ELSE 0 END) AS POINT1,
SUM(CASE WHEN TABLE1.POINT = 2 THEN TABLE1.POINT ELSE 0 END) AS POINT2,
SUM(CASE WHEN TABLE1.POINT = 3 THEN TABLE1.POINT ELSE 0 END) AS POINT3
FROM
TABLE1
LEFT JOIN TABLE2 ON TABLE1.ALBUM_NO = TABLE2.ALBUM_NO
やってみたところエラーが出ました。
INVALID EXPRESSION IN THE SELECT LIST(NOT CONTAINED IN EITHER AN
AGGREGATE FUNCTION OR THE GROUP BY CLAUSE)
かふぇさんの
”POINT1,POINT2...というフィールド名はプログラムの中で
作らなければいけませんが”
プログラムの中で作るとはどういうことでしょうか。
グループするの忘れてました。
最後に以下を加えてみてください。
GROUP BY
TABLE1.ALBUM_NO, TABLE2.ALBUM
これでどうでしょうか?
ありがとうございました!
望んだ結果とは少し違ったのですがこれでいけます!
ちなみに望んだ結果というのは、POINT1,POINT2,POINT3がそれぞれいくつあるか。
例えばALBUM[AAA]にPOINT1が2つ、POINT2が3つ、POINT3が1つ、としたときに、
ALBUM POINT1 POINT2 POINT3
AAA 2 3 1
というかんじで表示させたかったのです。
Ruさんのだと、POINTの合計となるんです。つまり
ALBUM POINT1 POINT2 POINT3
AAA 2 6 3
こういう感じ。
END)のあとに、POINT1であればEND) /1、POINT2であればEND) /2、POINT3であればEND) /3とすればよかったです。
SUMをCOUNTにしたらいけるかも。
希望の抽出じゃなければ無視してください。
ツイート | ![]() |