カウントした結果をそれぞれ表示させたい

解決


message  2007-03-31 01:08:15  No: 25525

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のみ)ならうまくできたのですが、
それが複数となるとどう書けばよいのか分かりません。
どなたかお教え願います。


Ru  2007-04-02 17:39:02  No: 25526

以下の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


かふぇ  2007-04-02 18:22:52  No: 25527

POINT1,POINT2...というフィールド名はプログラムの中で
作らなければいけませんが、こんなやり方はどうでしょうか?

select
  POINT,
  sum (POINT)
from
  TABLE1 LEFT JOIN TABLE2 ON
    TABLE1.ALBUM_NO = TABLE2.ALBUM_NO
group by
  POINT


message  2007-04-02 20:27:26  No: 25528

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...というフィールド名はプログラムの中で
  作らなければいけませんが”
プログラムの中で作るとはどういうことでしょうか。


Ru  2007-04-02 21:04:38  No: 25529

グループするの忘れてました。

最後に以下を加えてみてください。
GROUP BY
  TABLE1.ALBUM_NO, TABLE2.ALBUM

これでどうでしょうか?


message  2007-04-02 22:09:54  No: 25530

ありがとうございました!
望んだ結果とは少し違ったのですがこれでいけます!

ちなみに望んだ結果というのは、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とすればよかったです。


Ru  2007-04-02 22:38:22  No: 25531

SUMをCOUNTにしたらいけるかも。
希望の抽出じゃなければ無視してください。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加