• ベストアンサー
  • すぐに回答を!

3つのテーブルの処理について

下記のようなテーブルがあったとして、 テーブルAを基準に考えたいのですが、、、、 テーブルAに付加する形でテーブルBのデータのidカウント数が最も少なく、idが同じもの中でdate日が一番新しいデータを表示し、古いものから並べかえかつテーブルCにidがあるものは一番最後にくるという風に並べかえたいのですが、無理でしょうか? 現在下記のようなSQLを考えていますが、うまくいかないです。。 select * from A left join(select id,case when count(id)=0 then 0 else count(id) end AS cnt FROM B group by id order by date) as b on A.id=b.id left join(select id from C) as c on A.id=c.id order by c.id desc,b.cnt; エラー↓ in the GROUP BY clause or be used in an aggregate function テーブルA id | name | comment| 1 あ   おい 2 い   えい 3 か   テス テーブルB id | event | date | 1 test1 2005/1/4 2 test1 2005/1/4 1 test2 2005/3/4 2 test2 2005/3/4 1 test3 2005/5/4 テーブルC id | 1 理想の結合データ id | name | comment| cnt | date | 3 か   テス 0    2 い   えい 2  2005/3/4  1 あ   おい 3 2005/5/4

共感・応援の気持ちを伝えよう!

  • PostgreSQL
  • 回答数1
  • 閲覧数218
  • ありがとう数1

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

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

内部結合で。 select A.id,A.name,A.comment, count(B.id) as cnt, max(B.date) as date, '0' as CK from A,B where B.id=A.id and not exists( select id from C where C.id=A.id ) group by A.id,A.name,A.comment UNION select A.id,A.name,A.comment, 0 as cnt, NULL as date, '0' as CK from A where not exists( select id from C where C.id=A.id ) and not exists( select id from B where B.id=A.id ) group by A.id,A.name,A.comment UNION select A.id,A.name,A.comment, count(B.id) as cnt, max(B.date) as date, '1' as CK from A,B,C where B.id=A.id and C.id=A.id group by A.id,A.name,A.comment UNION select A.id,A.name,A.comment, 0 as cnt, NULL as date, '1' as CK from A,C where C.id=A.id and not exists( select id from B where B.id=A.id ) group by A.id,A.name,A.comment order by CK,cnt;

共感・感謝の気持ちを伝えよう!

質問者からのお礼

こんなにいっぱい書いていただきありがとうございます。 でも、できませんでした。。なんででしょう。。 adding missing FROM-clause entry in subquery for table "A"

関連するQ&A

  • Access 2000 サブクエリとJOIN

    Access2000でSQLを発行したのですが、 エラーが出てしまいます。 テーブル(仮にtest1、test2)があるとして test1 ------------------------- 主キー | 番号|項目    1|  1|りんご    2|  2|ぶどう    3|  3|みかん    4|  4|いちご test2 ----------------------------- 一つ目|二つ目| 1| 2| 4| 1| ・・・略 test2には2つのフィールドがあり、1,2,3,4を既定値として 入れるようにしています。 やりたいとこは、test2をグループ化し「一つ目」と「二つ目」 の規定値の個数(1、2、3、4)それぞれのカウントを求めたいのです。 一つのフィールドの場合は、 select * from test1 join test2 test1.番号=test2.一つ目 group by test1.番号 で求められたのですが、二つのフィールドをグループ化した際、 一つ目のフィールドと同じ個数が二つ目のフィールドにコピーされてしまうのです。 ですので、FROM句でサブクエリを結合しその中で、 group化したものを、いくつかのサブクエリと結合し てみたのですが、うまくいきませんでした。 select cnt1.一つ目,cnt2.二つ目 from (select * from test1 left join test2 on test1.番号=test2.一つ目group by test1.番号) as cnt1 left join (select * from test1 left join test2 on test1.番号=test2.二つ目group by test1.番号) as cnt2 on cnt1.番号=cnt2.番号 といった形で作ってみました。 エイリアスをつけてしまった時点でエラーが出ているので、 どうにもしようがありません。 申し訳ないのですが、ご教授のほどよろしくお願いいたします。

  • rand()を使った場合の全件ソートを避ける方法ありますか?

    test1とtest2の結合しtest2にしかない複数のレコードから ランダムにc_idを取得したいのですがtest2で全件ソートしています。 もう少し、効率的な書き方はあるでしょうか? SELECT A.*, B.c_id FROM test1 A INNER JOIN (select a_id,b_id,c_id from test2 order by rand()) as B ON A.a_id = B.a_id AND A.b_id = B.b_id WHERE いろいろ GROUP BY いろいろ

  • 集約関数に対する条件??

    条件式の挿入に関して思った結果を出せずおり 質問させて頂きます 現在テーブルが二つあり以下のようになります t1(テーブル1) ============= id No(商品番号) ------------- 1 001 2 002 3 003 ============= t2(テーブル2) ====================== No(商品番号) day(入荷日) ---------------------- 002 2008/04/01 003 2008/02/22 003 2008/04/10 ====================== 商品に対して入荷回数(cnt)と最終入荷日(lastday)を知りたく select t1.id, count(t2.No) as cnt, max(t2.day) as lastday from t1 LEFT JOIN t2 on t1.No=t2.No group by t1.No; としました 結果1 ====================== No cnt lastday ---------------------- 001 0 002 1 2008/04/01 003 2 2008/04/10 ====================== 上のセレクトは「現在」の結果ですので 例えば2008/03/30現在の表記が欲しく select t1.id, count(t2.No) as cnt, max(t2.day) as lastday from t1 LEFT JOIN t2 on t1.No=t2.No where t2.day <= '2008/03/30' or t2.day is null group by t1.No; または select t1.id, count(t2.No) as cnt, max(t2.day) as lastday , t2.day from t1 LEFT JOIN t2 on t1.No=t2.No group by t1.No having t2.day <= '2008/03/30' or t2.day is null; とすると 結果2 ====================== No cnt lastday ---------------------- 001 0 003 1 2008/02/22 ====================== となります No:001 の情報(cnt:0)と同様に 希望結果 ====================== No cnt lastday ---------------------- 001 0 002 0 003 1 2008/02/22 ====================== No:002 cnt:0 の結果を残すのにはどのようなセレクト文を組んだらよいのでしょうか? 宜しくお願いいたします mysql 4.0 わかりやすい表題が思いつかず 表題と内容が食い違っているかもしれません 大変申し訳ありません

    • ベストアンサー
    • MySQL
  • 助けて>< 3つのテーブルで簡単な集計

    下記のような3種類のテーブルがあります。 これを集計して、指定したユーザーの指定月のアクセス日時と売上げ金額を表にしたいと思っています。 こんな感じに。 +--+--------+----------+-------+-----+ | id | username| date   | access | sales | +--+--------+----------+-------+-----+ | 1 | admin | 2010-11-13 |   2 | 5000 | | 1 | admin | 2010-11-14 |   2 | 5000 | | 1 | admin | 2010-11-15 |  1 | 20000 | +--+--------+----------+-------+-----+ SELECT u.id AS id, u.username, DATE(a.created_at) AS date, COUNT(*) AS access, SUM(s.amount) AS sales FROM sf_guard_user u INNER JOIN sales s ON u.username = s.user_id LEFT JOIN access_log a ON u.username = a.user_id WHERE (u.username = 'admin' AND a.created_at > '2010-11-01 00:00:00' AND a.created_at < '2010-11-30 23:59:59') GROUP BY date ORDER BY a.created_at; とやってみたのですがダメでした;; ■ユーザー情報テーブル mysql> select id,username from user; +--+---------+ | id | username | +--+---------+ | 1 | admin   | +--+---------+ ■アクセスログテーブル mysql> select * from access_log; +--+-------+--------+------------------+ | id | user_id | ip     | created_at      | +--+-------+--------+------------------+ | 1 | admin  | 127.0.0.1 | 2010-11-13 21:56:54 | | 2 | admin  | 127.0.0.1 | 2010-11-13 21:56:54 | | 3 | admin  | 127.0.0.1 | 2010-11-14 21:56:54 | | 4 | admin  | 127.0.0.1 | 2010-11-14 21:56:54 | | 5 | admin  | 127.0.0.1 | 2010-11-15 21:56:54 | +--+-------+--------+------------------+ ■売上げ金額テーブル mysql> select * from sales; +--+-------+------+------------------+ | id | user_id | amount| created_at      | +--+-------+------+------------------+ | 1 | admin  |  5000 | 2010-11-13 21:56:54 | | 2 | admin  |  5000 | 2010-11-14 21:56:54 | | 3 | admin  |  5000 | 2010-11-15 21:56:54 | | 4 | admin  |  5000 | 2010-11-15 21:56:54 | +--+-------+------+------------------+

    • ベストアンサー
    • MySQL
  • テーブルの結合(GROUP BY句の制約について)

    次のような操作がしたいのですが、 Test1 t1 1 2 Test2 tt1 tt2 tt3 1  1  aa 1  2  bb -ココ 2  1  cc 2  2  dd 2  3  ee -ココ 結果 Test1とTest2を関連付けて t1 tt1 tt2 tt3 1 1 2 aa 1 2 3 ee Test2.tt2をマックス関数での参照です。 一応次のような操作をしてみました。 select T1, X.tt1, X.tt2, X.tt3 from Test1 inner join (select tt1, max(tt2) as tt2, tt3 from Test2 group by tt1, tt3) as X on (t1 = X.tt1) group by句にtt1とtt3を付けいるせいか、 すべて(Test1とTest2)が表示されます。 groupBY句の制約のせいですが・・・ 何かアドバイス等がありましたら、宜しく御願いします。

  • テーブルの結合について

    以下の二つを実行すると、2 の方がかなり速いのですが理由が分かりません。 分かる方教えてもらっていいですか? DBはMYSQLでInoDBです。 ちなみに Aは1万件、B は10万件ほど 1 のSQL SELECT * FROM A LEFT JOIN (SELECT * FROM B WHERE ・・・ GROUP BY XXX) B ON A.id = B.XXX WHERE ・・・ GROUP BY A.id 2 のSQL (SELECT * FROM A ・・・ GROUP BY ID ) A LEFT JOIN (SELECT * FROM B WHERE ・・・ GROUP BY XXX) ON A.ID = B.XXX.ID

  • 3つのテーブルを使ったselecct文でのorder by とgroup by の使い方について

    下記のようなSQL文を作成しましたが、 baseテーブルにあるu_dateというものでソートしたいと思っています。 u_dateは日付が入っていますが、order by だけ追加してもエラーになってしまい、group by を追加 すると、idとp_numが同じものであるのに、日付が違うものがあるので、group分けされてしまい、何個も表示されてしまいます。(idとp_numで一つのものと考えているので、一つのidに対して複数のものが選択されていることもあります) 何かよい解決策はないでしょうか? select b.id,b.name,b.p,b.a,b.i_date,w.p_name,p.p_num from base as b,win as w,pre as p where 1=1 and w.id = b.id and b.kind=1 and b.deleteflag=0 and w.win_flag=0 and p.p_num = w.p_num group by w.id,b.id,b.name,b.p,b.a,b.i_date,w.p_name,p.p_num order by w.id desc,p.p_num

  • WITH句で複数テーブルを定義する方法

    WITH句で複数テーブルを定義する方法を知りたいです。 どこかのサイトで、複数テーブルを定義するには、以下のような 方法にて実現できる旨の記事を目にしました。(withでの宣言テーブル間を「,」で区切る)ですが、「'.' 付近に不適切な構文があります。 」のようにエラーがメッセージ欄に表示されます。 ------------------------------------------------------------ WITH a (code, cnt) as ( select code, count(*) from abc where a is null group by documentcode), b (ttr.documentcode, cnt) as ( select ttr.documentcode, count(*) from abc tr inner join def ttr with(nolock) on tr.seqno = ttr.seqno where SendTime is null group by documentcode ) select * from a cross join b; ------------------------------------------------------------ ご存知の方でコメント頂ける方、お手数お掛けしますが、 宜しければ教えて下さい。

  • sqlserver2005 JOINしてUNION

    現在下記のSQL文で会社単位で訪問回数と請負費を出していますが。 JOINしているテーブルをUNION(複数テーブルの合計)するにはどうしたらいいですか? (テーブルは社員単位で作成しています) SELECT TEST11.会社名, SUM(TEST2.訪問回数) AS 訪問回数, SUM(TEST2.訪問回数 * TEST2.単価) AS 請負費 FROM TEST11 RIGHT OUTER JOIN TEST2 ON TEST11.訪問日 = TEST2.訪問日 AND TEST11.区分コード = TEST2.管理番号 GROUP BY TEST11.会社名 ORDER BY TEST11.会社名 結果は下記になってます |会社名|訪問回数|請負費| 分る方ご教授頂けると幸いです

  • 3つのテーブルを結合した場合のWHERE

    MySQLで3つのテーブルを結合した場合のWHEREがよくわかりません。 まず、下のような2つのテーブルがあるとします。 【テーブルaa】 ID | Name -------------- 1 | x 2 | y 3 | z 【テーブルbb】 ID | hizuke | category --------------------- 1 | stamp1 | a 1 | stamp2 | b 1 | stamp3 | c 2 | stamp1 | a 2 | stamp2 | d 3 | stamp1 | c この2つのテーブルを結合して、同じIDでhizukeが最大値のデータを抽出するクエリは、 http://okwave.jp/qa/q6918385.htmlを参考にして、 SELECT aa.Name, bb.category FROM bb INNER JOIN aa ON aa.ID = bb.ID where (bb.ID, bb.hizuke) in (SELECT bb.ID, max(bb.hizuke) FROM bb group by bb.ID ) ; でできました。 しかし、もう1つテーブルを結合すると期待した結果が得られなくなってしまいました。 【テーブルcc】 category | choice --------------------- a | ss b | tt c | uu というテーブルがあって、上のクエリで得られた bb.categoryと cc.categoryをリンクして、choiceを取得しようとしたのですがうまくいきません。 SELECT aa.Name, bb.hizuke, bb.category, cc.choice FROM bb INNER JOIN cc ON bb. category = cc. category INNER JOIN aa ON aa.ID = bb.ID where (bb.ID, bb.category, bb.hizuke) in (SELECT bb.ID, bb.category, max(bb.hizuke) FROM bb group by bb.ID ); というクエリでは、ダメなようです。 INNER JOINを入れ子にしたり、いろいろと試したのですがどうにもうまくいきません。 どうも私の力では解決困難なようです。どなたかヘルプを。