- ベストアンサー
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と表示させたいです。 何卒宜しくお願い致します。
- みんなの回答 (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
その他の回答 (3)
- yambejp
- ベストアンサー率51% (3827/7415)
一度フラグが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.`)
お礼
いつもありがとうございます。 参考になりました。
- chukenkenkou
- ベストアンサー率43% (833/1926)
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
- shirayukix
- ベストアンサー率43% (90/207)
前の質問にもこれ書いたんですけど? 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以上の場合しか場合出力されませんが、参考まで。
補足
前の質問とは内容が異なります。
お礼
どうもありがとうございました。 助かりました。