グループ関数と結合を同時に使うには?

このQ&Aのポイント
  • Oracleの初心者であるjavarowaさんが、Test1とTest2という表から特定の情報を取得する方法について質問しています。
  • 具体的には、Test1のcustomer codeとshop codeの組み合わせごとのカウントと、Test2のshop codeとshop nameを取得したいとのことです。
  • javarowaさんは既にそれぞれの情報を取得するクエリを試していますが、それらを同時に取得する方法が分からないとのことです。
回答を見る
  • ベストアンサー

グループ関数と結合を同時に使うには?

はじめまして。昨日今日Oracleの世界に足を踏み入れたくらいの初心者で、javarowaと申します。 さっそく質問なのですが、たとえばTest1とTest2という表があり、Test1にはcustomer codeと shop codeの二つの列、Test2にはshop codeとshop nameという二つの列があるとします。ここで主キーは Test1はcustomer codeとshop codeの組み合わせ、Test2はshop codeです。この場合、select文で shop code, shop name, およびshop codeごとのcustomer codeの数、という三つの情報を得るには どのようにすればよいでしょうか(引っ張った情報はshop codeの昇順でソートします)。shop codeごとのcustomer codeは select distinct shop code, count(customer code) from Test1 group by shop code order by shop code で、また、shop codeに紐づくshop nameは select distinct shop code, shop name from Test1 natural join Test2 order by shop code で、それぞれ出ると思うのですが、この二つを同時に表すにはどうすればよいのかが分かりません。 (あるいはnatural joinだとダメなのでしょうか。そのあたりからしてあやふやです…) 非常に初歩的な質問で恐縮ですが、どなたかお教え願えないでしょうか。

noname#67342
noname#67342
  • Oracle
  • 回答数1
  • ありがとう数10

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

  • ベストアンサー
  • nfushi
  • ベストアンサー率31% (39/122)
回答No.1

こういうことでしょうか? select T2.shopcode, T2.shopname, COUNT(T1.customercode) from Test1 T1 inner join Test2 T2 on T1.shopcode = T2.shopcode group by T2.shopcode, T2.shopname order by shopcode

noname#67342
質問者

お礼

回答ありがとうございます! そしてまた質問で恐縮なのですが、このgroup by句以下の解釈は どのようになるのでしょうか。カウントするためにshopcodeで グルーピングするのは分かるのですが、その次の管理会社名も groub byされているのはなぜですか? もしよろしければお願いします。

関連するQ&A

  • mysql 自然結合後のカラム並び替え

    mysqlで ■address_book +------+------+------+ | code | tel | name | +------+------+------+ | 41 | 012| android | +------+------+------+ ■customers +------+------+------+ | code | title | name | +------+------+------+ | 41 | abc| android | +------+------+------+ SELECT * FROM address_book NATURAL JOIN customers; で自然結合を行って、 その結果 +------+------+------+------+ | code | title | name | tel | +------+------+------+------+ | 41 | abc| android | 012| +------+------+------+------+ と結果が出て、 この結果を +------+------+------+ | title | code | name | +------+------+------+ | abc | 41 | android | +------+------+------+ の順に表示させる様に、SQLを実行したいのですが、 SELECT * FROM address_book NATURAL JOIN customers; SELECT title, code, name FROM address_book; と連続でコマンドを実行できる方法はないのでしょうか? phpmyadmin でSQLを実行しています。 お分かりになられる方、ご教授お願い致します。

    • ベストアンサー
    • MySQL
  • INSERT,DELETEを同時に

    $sql = "INSERT INTO daykg(id,name,day,kg)select distinct id,name,'$day','-1'from daykg"; $sql = "DELETE FROM daykg WHERE distinct ORDER BY day DESC LIMIT 5,1"; 上で会員全員にインサート、下で会員全員の五行目から一行削除としているつもりですが、合ってますか??

    • ベストアンサー
    • PHP
  • SQL文「DISTINCT」の「ORDER BY」について

    SQL文「DISTINCT」の「ORDER BY」について教えて下さい。 A列をDISTINCTで重複行の排除をしています。 その後、B列でORDER BYをかけたいのですが、エラーが 出てしまいます。A列でのORDER BYは成功します。 何か良い方法があれば教えて下さい。 よろしくお願いします。 SQL="SELECT DISTINCT A列 from table " &_ "WHERE (table.C列='100') " &_ "ORDER BY (table.B列) ASC " ⇒エラー    "ORDER BY (table.A列) ASC " ⇒成功

  • GROUP BY と DISTINCT

    SQLPLUSにおいて、ある表X1(code1,code2)に (A,1),(A,1),(A,2),(A,2),(A,3),(A,3) (B,4),(B,4),(B,5),(B,5),(B,6),(B,6) というデータがあり、別の表X2(data1,data2)に (1,10),(2,20),(3,30),(4,40),(5,50),(6,60) というデータがある場合に(X2の左の要素はprimary) 結果として(A,60),(B,150)というデータを得たいのですが、GROUP BY や DISTINCT を使おうするとエラーになってしまいうまくいきません。 <select code1,sum(data2) from X1,X2 where distinct(X1.code2) = X2.data1 group by code1> みたいな感じでやりたいのですが、(distinctがこの使い方でできないのはわかってます)どうしたらいいでしょうか? ちなみに副問合せを使って先にX1から(A,1),(A,2)...(B,6)をセレクトしようとしてもダメでした。 説明がわかりづらくて申し訳ございませんがどなたか詳しい方のアドバイスをお願い致します

  • グループ後に結合させたいのですが・・

    以下の様なデータがあります。       氏名  科目 得点 1行目  Aさん  国語 100 2行目  Bさん  国語 90 3行目  Aさん  英語 80 これを以下の様な表にしようと思い、 氏名 国語 英語 Aさん 100 80 Bさん 90 - 以下のSQL分を書きましたが、Aさんの得点が2倍になってしまいます。 SELECT SL.氏名 ,SUM(KT.得点) AS '国語' ,SUM(ET.得点) AS '英語' FROM [test_db].[dbo].[得点データ] SL LEFT OUTER JOIN ( SELECT * FROM [test_db].[dbo].[得点データ] WHERE 科目='国語' ) KT ON ( KT.氏名 = SL.氏名 ) LEFT OUTER JOIN ( SELECT * FROM [test_db].[dbo].[得点データ] WHERE 科目='英語' ) ET ON ( ET.氏名 = SL.氏名 ) GROUP BY SL.氏名 原因として、グループ化が結合の後にしているのだと考えています。 どの様に修正したら、いいでしょうか?

  • VisualStudio2005でのGridView 集計

    VisualStudio2005でGridViewを使って集計表を出そうと思い下記のSQL文を作成しましたが明細で出てしまいます。 どこが間違っているのでしょうか? ---------------------------------------------------------------- </asp:GridView> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:meldandyConnectionString %>" SelectCommand="SELECT DISTINCT [kamoku_code], [kamoku_name], [s_code], [s_name], [kingaku] FROM [a_keihi_dt] WHERE ([kamoku_code] > @kamoku_code2) GROUP BY [s_code], [kamoku_code], [kamoku_name], [s_name], [kingaku] ORDER BY [s_code], [kamoku_code]">

  • 2つの異なるテーブルを和結合し、重複のない名前だけ出力する方法

    2つの異なるテーブルを和結合し、重複のない名前だけ出力させるSQLを書きたいのですが どこが間違っているでしょうか? select distinct name from ( select name from test1 union select name from test2 ) ; test1テーブル name 国語 算数 理科 社会 test1テーブル name 国語 体育 家庭科 社会 結果 name 国語 算数 理科 社会 体育 家庭科

  • SELECTのスピード

    SELECTのスピードでどの方法が 検索スピードが速いのか教えてもらいたいのですが Aのテーブル DENNO CODE Bのテーブル CODE NAME Aのテーブルを主にAのCODEでBのテーブルを参照したい時 (1) SELECT A.DENNO,A.CODE, (SELECT B.NAME from B where A.CODE=B.CODE) AS NAME from A (2) SELECT A.DENNO,A.CODE,B.NAME FROM A LEFT JOIN B ON A.CODE=B.CODE (3) SELECT A.DENNO,A.CODE,B.NAME FROM A , B WHERE A.CODE=B.CODE(+)

  • OraclのSQL文について(No2)

    前回の質問の続きとなります。 Oracl の SQL文について、教えて下さい。 [A]テーブルに [CODE] と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [B]テーブルに [CODE] と [NOUKI] と [KIN] フィールドがあるとします。 内容は、 A-1 2005/01/01 100 A-1 2005/01/02 200 A-2 2005/01/01 300 A-2 2005/01/10 400 A-2 2005/12/10 500 と、します。 結果が、 A-1 NAME-1 300 A-2 NAME-2 1200 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? SELECT A.CODE, A.NAME, B.KIN FROM A, B WHERE A.CODE = B.CODE ORDER BY A.CODE と、すると A-1 NAME-1 100 A-1 NAME-1 200 A-2 NAME-2 300 A-2 NAME-2 400 A-2 NAME-2 500 と、言う結果がでます。(当然ですが) しかし、 SELECT A.CODE, A.NAME, A2.KIN FROM A, A2 WHERE A.CODE = A2.CODE GROUP BY A.CODE,A.NAME ORDER BY A.CODE と、すると[GROUP BYの式ではありません]と、エラーになってしまいます。 (SUM文以前の問題でした) よろしくお願い致します。

  • 結合が上手くいきません

    以下のテーブルがあるとします table1 名前|住所コード|勤務地コード table2 コード|名称 テーブル1の検索結果にテーブル2の名称を引っ張ってきて取得したいのですがどうやるのでしょうか? SELECT * from table1 INNER JOIN table1.住所コード ON table2.コード INNER JOIN table1.勤務地コード ON table2.コード これではうまくいきませんでした。 SELECT (select 名称 from table2 where table2.コード=table1.住所コード),(select 名称 from table2 where table2.コード=table1.勤務地コード) FROM table1 これは上手くいくのですが重いらしいので、、、

    • ベストアンサー
    • MySQL