• ベストアンサー

SQLの質問

※前質問は間違いました為、再度、質問させて頂きました。 以下のようにテーブルにレコードが登録されていたとします。 顧客テーブル(customer) 客No. 名前 1 鈴木 2 佐藤 3 高橋 4 田村 5 長谷川 登録テーブル(reserve) 客No. 日付 フラグ 1  2007-05-05   1 1  2007-05-06   2 2  2007-06-05   1 3  2007-05-30   1 5  2007-05-25   2 このとき、以下のような結果を表示させたいのですが どのようなクエリを作成すればよろしいのでしょうか。 客No. フラグが1であったレコード数 1   1 2   1 3   1 4   NULL 5   0 ※客No4は登録テーブルに存在しなかった為 NULLと表示させたいです。 何卒宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

#2回答者です。 #3回答者さんのSQLを見て、#2のSQLを簡略化しました。 select c.客No, sum(フラグ=1) as フラグ1 from customer as c left join reserve as r on c.客No=r.客No group by c.客No

kadai1800
質問者

お礼

どうもありがとうございました。 助かりました。

その他の回答 (3)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

一度フラグが1であったレコード数を集計した物を テンポラリにいれてからLEFT JOINするのが妥当。 CREATE TEMPORARY TABLE `temp_reserve` SELECT `客No.`,sum(`フラグ`=1) as `フラグが1であったレコード数` FROM `reserve` GROUP BY `客No.`; SELECT `customer`.`客No.`,`フラグが1であったレコード数` FROM `customer` LEFT JOIN `temp_reserve` USING(`客No.`)

kadai1800
質問者

お礼

いつもありがとうございます。 参考になりました。

回答No.2

MySQLの質問をする場合は、バージョンを明記してください。 4.0以前、4.1、5.0以降で、できることがかなり違います。 ここの利用規約では、「自分なりに考えて、分からなかったところを具体的に示す」ことになっています。仕様だけ提示して、「SQLを作って」といった書き方は、「質問でなく、作業依頼」と解釈されると、削除されてしまう点に注意してください。 次のSQLを試してみてください。 select c.客No, sum(case when フラグ=1 then 1 when フラグ<>1 then 0 when フラグ is null then null end) as フラグ1 from customer as c left join reserve as r on c.客No=r.客No group by c.客No

回答No.1

前の質問にもこれ書いたんですけど? select customer.cid,count(customer.cid) from customer left join reserve on customer.cid = reserve.cid where reserve.flag = 1 group by customer.cid これだと「フラグが1であったレコード数」が1以上の場合しか場合出力されませんが、参考まで。

kadai1800
質問者

補足

前の質問とは内容が異なります。

関連するQ&A