• ベストアンサー

サブクエリーについて教えてください。

こんにちは!以下のようなことがサブクエリーを使用してできるか?他にどんな方法があるか、アドバイスをお願いします。 あるテーブル(TABLE)から2段階でデータをselectし、計算させたいのですが分かりません。 一段階目 select a,b,c,d,e,f from TABLE where a='A' and b='B' 二段階目(上記の結果を使って、ここからが分かりません) select c,d,e,sum(f) as 結果 from TABLE(?) group by c,d,e having e='E' やりたいことの概要: 1. a='A' and b='B'でデータを抽出 2. 1.で抽出したデータに対してグループ化して集計する これを一回で実行するにはどのようにしたら良いでしょうか?サブクエリーでできそうだと思い、いろいろ調べましたが、よく分かりませんでした。 よろしくお願いします。

noname#10916
noname#10916

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

  • ベストアンサー
  • kameid
  • ベストアンサー率44% (8/18)
回答No.4

from 句にサブクエリーを書くのを インラインビューって言うんですが、 参考URLを見ると、SQL Server 2000 では 未対応となっていますね。 勿論、下記「1段階目」の SQL を view にしてやれば、同様のことはできます。 -------------- select a,b,c,d,e,f from TABLE where a='A' and b='B' -------------- 上記を view にして、「二段階目」の テーブル名のところにこの view を指定するわけです。

参考URL:
http://www.microsoft.com/japan/SQL/evaluation/compare/prk/vsOracle4_7.asp
noname#10916
質問者

お礼

ありがとうございます。 いろいろ調べたのですが調べ方が悪いのかなかなか分かりませんでした。 勉強していきますので、これかもよろしくお願いします。

その他の回答 (3)

回答No.3

細かい箇所が良くわからなかったのですが、 次のSQL文で取得できませんでしょうか? select c,d,e,sum(f) as 結果 from TABLE where a='A' and b='B' and e='E' group by c,d,e

noname#10916
質問者

お礼

ご回答ありがとうございます。 サブクエリーにこだわり過ぎていました。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

そのまま埋め込むだけ。 select c,d,e,sum(f) as 結果 from (select a,b,c,d,e,f from TABLE where a='A' and b='B') group by c,d,e having e='E' #ただし、SQL Serverのバージョンによっては出来なかったはず。

noname#10916
質問者

補足

ご回答ありがとうございます。 kameidさんからも同様に指摘されていますが、 SQL SERVER 2000ではご回答のようなサブクエリーは使用できないのでしょうか? クエリアナライザで実行すると、キーワード'GROUP'付近に正しくない構文があります。というエラーが出ます。 よろしくお願いします。

  • kameid
  • ベストアンサー率44% (8/18)
回答No.1

これ、 select c,d,e,sum(f) as 結果 from TABLE where a='A' and b='B' group by c,d,e having e='E'; でだめですか? サブクエリー使うなら、単純に select c,d,e,sum(f) as 結果 from (select a,b,c,d,e,f from TABLE where a='A' and b='B') group by c,d,e having e='E'; とかですかね。ただし、DBMS依存です。

noname#10916
質問者

お礼

ありがとうございました。 サブクエリーを意識していたので、単純なところに目が行きませんでした。 サブクエリーを使わなくて良かったんですね^^;

関連するQ&A

  • サブクエリーなしで実現できますか?

    以下のA、Bを結合して期待する結果を得たいです。 条件 ・MySQL4なのでサブクエリーは使えません。 ・テーブルの型が異なるので、UNIONは使えません。 ・両テーブルともa b の2カラムでプライマリキーになります。 ■テーブルA a b ---- 1 2 1 4 ■テーブルB a b c d -------- 1 3 c d 1 4 c d ■結果 1 2 1 3 1 4

    • ベストアンサー
    • MySQL
  • サブクエリー操作について

    また、わからない事が出てきました。 table_1とtable_2からSQL文で以下の抽出結果を得たいのですが どうもうまく行きません。 ☆table_1 u_no , u_name , u_flag  1 , 山田 , 1  2 , 田中 , 1  3 , 鈴木 , 0 ☆table_2 b_no ,b_uno , b_title , b_date  1 , 1 , 本  , 2007-01-10  2 , 1 , 鉛筆 , 2007-01-03  3 , 2 , ペン , 2007-01-15  4 , 2 , 本  , 2007-01-13  5 , 2 , 本  , 2007-01-03  6 , 3 , ノート, 2007-01-01  7 , 3 , 本  , 2007-01-08 ⇒抽出結果 (日付順) b_no ,b_uno , b_title , b_date  4 , 2 , 本  , 2007-01-13  1 , 1 , 本  , 2007-01-10  5 , 2 , 本  , 2007-01-03 一応以下のようなSQL文などでいろいろやっているのですが、existsなどの使い方が 良くないのでしょうね。 select b_no,b_uno,b_title,b_date from table_1 as t1,table_2 where exists (select * from table_2 as t2 where t1.uno=b_uno and t1.u_flag='1' and t2.b_title like '%本%' ) group by b_uno order by b_date desc 尚 MySQLは、5.0を使っています。 どなたかご存知の方がいらっしゃいましたら よろしくご教授お願い致します。

    • ベストアンサー
    • MySQL
  • ACCSESSのクエリについて教えてください

    すみません! SQL初心者なのですがクエリについておしえてください。 table1 id kigou 1 a 2 b 3 c 4 d 5 e table2 id kigou 1 a 2 b 3 cc 4 ee 上記の2テーブルよりkigouのc d eが含まれるデータを抽出して kigouの1桁目が同じもののidを合計する場合、どのような 構文になりますでしょうか。。 以下のように記載しましたが、その後どうすればよいかわかりません。 select * from table1 left join table2 on table1.id=table2.id where table1.kigou in ('c','d','e') or table2.kigou in ('c','d','e') そもそもアプローチの仕方が間違っているのでしょうか。。

  • オラクルではできるのにSQLSERVERではサブクエリーで複数キーを指定できない?

    サブクエリーで複数キーを指定したいです。例えば以下のようなSQLですが、 SQL> > select * from テーブルA > where (key1,key2) in (select key1,key2 from テーブルB) このSQLはオラクルでは実行できますが、SQLSERVERでは文法エラーになってしまいます。SQL SERVER ではサブクエリーで複数キーを指定するのは不可能なのでしょうか?

  • Mysql サブクエリの使い方

    table_A ---+------ id | count ---+------ 1 | 5 ---+------ 2 | 6 ---+------ 3 | 7 ---+------ table_B ---+----- id | sub_count ---+----- 1 | 2 ---+------ 2 | 2 ---+------ 3 | 5 ---+------ 1 | 3 ---+------ 2 | 4 ---+------ このようなテーブルで table_Aのcountと、table_Bのidでまとめたsub_countの合計が 一致しないidだけを抽出するために、 SELECT table_A.id FROM (SELECT sum(table_B.sub_count) FROM table_B GROUP BY table_B.id) AS B, table_A, table_B WHERE table_A.id = table_B.id AND table_A.count != sum(table_B.sub_cout) と書いてみましたが、うまくいきません。 ERROR 1111 (HY000): Invalid use of group function 何が悪いのでしょうか? mysqlも投稿も初心者です。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 重複データの抽出方法(複数項目)

    以下のようなテーブルからc列とd列のデータが重複しているレコードを取得したいために、以下のSQLを試してみました。 a列|b列|c列|d列 ---|---|---|--- 01 |01 |01 |01 02 |01 |01 |01 03 |02 |01 |03 04 |02 |02 |03 05 |01 |01 |02 06 |02 |02 |03 select * from テスト where c in (select c from テスト group by c,d having count(*)>1) and d in (select d from テスト group by c,d having count(*)>1) そうしたところ、以下の結果になってしまいました。 想定では、○のレコードだけ抽出できると思ったのです。 ×のレコードを抽出したくないのですが、SQLのどこが 間違っているのでしょうか? a列|b列|c列|d列 ---|---|---|--- 01 |01 |01 |01 ○ 02 |01 |01 |01 ○ 03 |02 |01 |03 × 04 |02 |02 |03 ○ 06 |02 |02 |03 ○ (使用DB)SQLServer2000

  • SQL 表の結合

    SQLで2つの表から条件に合ったデータを取り出し、同じ列に表示させたいのですが、 どうやっても外部結合のようにすることしかできませんでした。 取り出したデータを縦に結合?させることはできるのでしょうか? 例) dataは月の上旬中旬下旬でそれぞれabcとします。 入力値はmonthとdayで、これらからuriageを選択します。 dataの取りうる値はa,b,c,ab,bc,abcとします。    table:A 売上表            table:B 上旬中旬下旬判断 ---------------------------   -----------  key | data | month | uriage   day | data ---------------------------    -----------   1 |  a  |  1  |  500      1 |  a   2 |  ab  |  1  |  800     … |  …   3 |  bc  |  1  |  400     10 |  a   4 |  c  |  1  |  100     11 |  b   5 |  abc |  1  |  900     … |  …   … |  …  |  …  | …     31 |  c ---------------------------    ----------- month = 1 , day =5のとき  table:Bより   SELECT data FROM table:B WHERE day = 5 としてdata "a" を得ます。 この"a"と同じdataを持つuriageを表示させたいので   SELECT uriage FROM table:A   WHERE month = 1 AND data = (SELECT data FROM table:B WHERE day = 5) として  table:query1  --------    uriage  --------    500  -------- を得ました。 ここまでは良いのですが、これに付け加えて、 table:Bから取り出したdata "a"をtable:Aのdataが含むとき(data = a,ab,abcのとき) その全てのuriageを表示させたく、 ワイルドカードを使おうと   SELECT uriage FROM table:A   WHERE month = 1 AND data = %(SELECT data FROM table:B WHERE day = 5)% 等としてみたのですが、上手くいきませんでした。 そこで、別のクエリーを作って   SELECT uriage FROM table:A   WHERE month = 1 AND data = 'ab' AND data = 'abc' として  table:query2  ---------   uriage  ---------    800  ---------    900  ---------- を得ました。 そして、最後に、 得られた2つの表をまとめて  ---------   uriage  ---------    500  ---------    800  ---------    900  --------- としたいのですが、   SELECT uriage, uriage FROM query1, query2 とすると  ------------------   uriage | uriage  ------------------    500  |  800    500  |  900  ------------------ となりますし、UNIONは使い方がよくわからないためシンタックスエラーにしかならず...。 そもそも、縦に結合?はできるのでしょうか??? あれこれ試してみたのですが、詰まってしまったので、 どなたか知恵をお貸しください。

  • sqlについて

    下に書いたsqlのコードの内容(どういう処理でどういう結果になるのか)が知りたいです。 どなたかわかる方教えてください。 select b.ym, b.no,     isnull(e.sumcnt,0)as val, null as bunsi, null as bunbo from (select distinct ym,no from Table_A)b inner join (select ym from Table_B where cd=1)d on b.ym=d.ym left outer join (select b1.ym,b1.no,sum(c1.cnt)as sumcnt from Table_A b1 inner join (select ym from Table_B where cd=1)d1 on b1.ym=d1.ym inner join Table_C c1 on b1.ym=c1.ym group by b1.ym,b1no)e on b.ym=e.ym and b.no=e.no

  • PostgreSQLでサブクエリーをJOINする方法

    たとえば、 select A.field1, B.field1 from (select field1 from table1 where field2='x') A, (select field1 from table2 where filed2='y') B where A.field2=B.field2; のようなことをしたいのですが、 Oracleだとこの方法でデータを取ってこれるのですが、PostgreSQLだとエラーで返ってきてしまいます。 PostgreSQLのバージョンは6.5.3です。 バージョンが上がると上記の書き方も通るようになるのでしょうか? また、上記の書き方と同じ意味を持つ他の書き方をご存知でしたら教えてください。よろしくお願いします。

  • MySQLでサブクエリーが使えないため困っています

    MySQL3.23.58にて以下のSQLを実行したいのですが、 サブクエリーが利用できないため困っています。 やりたいことは、 1.memberテーブルにemailが重複したデータがあるため、 ユニークなemailを取得したい。 2.取得したemailを元にmemberテーブルを参照し、 シーケンシャルでユニークなidを取得したい。 3.その取得したidを元にflagが立っているものを取得したい。 以上になります。 実際に行いたいSQL文は以下になります。 select count(*) from member where id in ( select max(id) from member where email in ( select distinct email from M_MEMBER where email != '' and email not like '%@docomo.ne.jp' and email not like '%ezweb.ne.jp' and email not like '%ido.ne.jp' and email not like '%vodafone.ne.jp' and email not like '%@jp-%' ) ) and flag = 1; どうかよろしくお願いいたします。