• ベストアンサー

こういう場合のSQLの書き方。

はまっています。お知恵を貸してください。 Oracle8i WindowsNT4.0です。 tbl_testというテーブルがあります。 データが以下のように入っています。 col1   col2   col3 --------------------------------- A     B     C      A B     A     A C この時、col1 col2 col3それぞれのカラムの中で、 Aという値が何個あるか数えたいのです。 今は以下のように三つにわけてセレクトしていますが、 これをひとつの式にまとめたいのですが、可能でしょうか? UNIONしても欲しい答えは返ってきません。 =========================== SELECT COUNT(col1) AS col1 FROM tbl_test WHERE col1 = 'A' =========================== SELECT COUNT(col2) AS col2 FROM tbl_test WHERE col2 = 'A' =========================== SELECT COUNT(col3) AS col3 FROM tbl_test WHERE col3 = 'A' 欲しい答えは、 col1   col2   col3 ----------------------- 1     2     1 です。 なお、家に検証環境が無いので、検証&お礼は明日のお昼くらいになると思います。 宜しくお願い致します。

  • sunnys
  • お礼率95% (176/185)

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

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

間違えました。合計値をほしいわけじゃないんですね(^^;; こちらです。 select t1.col, t2,col, t3.col from ( SELECT count(col1) col FROM tbl_test WHERE col1 = 'A' ) t1, ( SELECT count(col2) col FROM tbl_test WHERE col2 = 'A' ) t2, ( SELECT count(col3) col FROM tbl_test WHERE col3 = 'A' ) t3

sunnys
質問者

お礼

ばっちりです。 どうもありがとうございました!

その他の回答 (3)

  • kumagoro-
  • ベストアンサー率57% (36/63)
回答No.4

SELECT   SUM(DECODE(col1,'A',1,0)) AS col1,   SUM(DECODE(col2,'A',1,0)) AS col2,   SUM(DECODE(col3,'A',1,0)) AS col3 FROM tbl_test でどうでしょうか? テストしていませんが、こんな感じで出来たと思います。

sunnys
質問者

お礼

ありがとうございます。 検証したのですが、少し違う値が返ってくるようです。 意味がわかっていないので、時間のあるときに調べてもう一度やってみようと思います。 知らない使い方なので勉強になりました。

  • stork
  • ベストアンサー率34% (97/285)
回答No.3

(オラクルは使ったことがないので、固有の部分は適宜修正してください。) select sum(sum_col1) as col1     ,sum(sum_col2) as col2     ,sum(sum_col3) as col3 from (select count(*) as sum_col1        ,0 as sum_col2        ,0 as sum_col3    from tbl_test where col1='A'        union all    select 0 as sum_col1        ,count(*) as sum_col2        ,0 as sum_col3    from tbl_test where col2='A'    union all    select 0 as sum_col1        ,0 as sum_col2        ,count(*) as sum_col3    from tbl_test where col3='A' ); もっとすっきりしたSQLがあると思いますが、取り急ぎ回答します。

sunnys
質問者

お礼

ありがとうございます。 いろんな方法があるのですね。勉強になります。

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

union allにしてます? select count(*) from ( SELECT col1 col FROM tbl_test WHERE col1 = 'A' union all SELECT col2 col FROM tbl_test WHERE col2 = 'A' union all SELECT col3 col FROM tbl_test WHERE col3 = 'A' );

関連するQ&A

  • シンプルなSQLの書き方がわかりません。

    以下のSQLをシンプルに一つにしたいのですが、どのように書いたらよろしいでしょうか? どうぞご返答頂けますようお願い申し上げます。 --test1_tblの抽出 select a1 as a1, b1 as b1 from a_tbl where c=1 --test2_tblの抽出 select a1 as a1, e1 as e1 from b_tbl where rowid in (select min(rowid) from ee group by a1) and a1 is not null and a1 !=' ' order by a1 --test1_tblとtest2tblの結合 select t0.a1 as a1, t0.b1 as b1, t1.e1 as e1 FROM test1_tbl t0, test2_tbl t1 WHERE (t0.a1 = t1.a1)

  • sqlplusの処理が途中でとまる

    oracle10gを使用しています。 sqlplusでいくつかのDDLとDMLを一度にコピーペーストで流しました。一つ一つの処理後にcommit;も入っています。 しかし、最後のDMLで処理がとまってしまい、エラーもでません。内容は以下のようになっています。 insert into tbl_a (select distinct col1,'2006/01/01' from tbl_b where col1 is not null union select distinct col2,'2006/01/01' from tbl_b where col2 is not null union select distinct col3,'2006/01/01' from tbl_b where col3 is not null union select distinct col4,'2006/01/01' from tbl_b where col4 is not null union select distinct col5,'2006/01/01' from tbl_b where col5 is not null union select distinct col6,'2006/01/01' from tbl_b where col6 is not null); COMMIT; この処理を単独で実行すると、成功します。sqlpulsは、実行コマンドの量に制限などあるのでしょうか?なぜ、このようになるかわかりません。ちなみに、コマンドの全文字数は3990目で、処理が停止するのは、3648文字目です。この3648文字目にあたるのが、上記の >select distinct col3,'2006/01/01' の >select disti です。 大変急を要ししています。 よろしくお願いします。

  • ACCESSのSQLの書き方

    ACCESSでのSQL文の書き方を教えてください。 テーブルtbl_Aとテーブルtbl_Bがあり, tbl_Aで得られた数値とtbl_Bで得られた数値を加えたものを結果として表示します。 どう書けばよろしいのでしょうか。どうしてもエラーになってしまいます。 イメージとしてはこんな感じです。 select (select ~~ from tbl_A where ~~)+(select ~~ from tbl_B where ~~) (もしoracleならば,「from dual」というのを最後に付けるんですが。)

  • mysql いろんな条件

    mysql いろんな条件 下記のようなテーブルより table1 3,60,,,,,テスト1,科目A 4,59,,,,,テスト1,科目B 3,60,,,,,テスト1,科目A 1,80,,,,,テスト1,科目B 3,60,,,,,テスト1,科目A 4,59,,,,,テスト1,科目B 5,23,,,,,テスト1,科目A 5,23,,,,,テスト1,科目B 7,13,,,,,テスト1,科目A table2 1,80,,,,,テスト1,科目B 3,60,,,,,テスト2,科目A 4,59,,,,,テスト2,科目B 3,60,,,,,テスト2,科目A 1,80,,,,,テスト2,科目B 3,60,,,,,テスト2,科目A 4,59,,,,,テスト2,科目B 5,23,,,,,テスト2,科目A 5,23,,,,,テスト2,科目B 7,13,,,,,テスト2,科目A 1,80,,,,,テスト2,科目B ↓ 結果1 テスト1,2,0,3,5 テスト2,2,0,3,5 結果2 科目A,0,0,6,4 科目B,4,0,0,6 現在 select count(*) from table1 where col7 = 'テスト1' and col1 = 1 select count(*) from table1 where col7 = 'テスト1' and col1 = 2 select count(*) from table1 where col7 = 'テスト1' and col1 = 3 select count(*) from table1 where col7 = 'テスト1' and col1 >3 このように1つ1つできていているのですが、 まとめてできる方法を知らないです。 また、1つずつやるとその分時間がかかります。 さらに1つのテーブルのみでしかやり方を知りません。 上記のようなテーブルから 結果1 テスト1,2,0,3,5 テスト2,2,0,3,5 結果2 科目A,0,0,6,4 科目B,4,0,0,6 このようなテーブルにする方法を教えてください

  • SQL初心者です。

    【Table1】 Col1 Col2 Aa A Ab A Ba B Bb B Ca C Ca D 【Table2】(Data1は固定) Data1 Data2 Aa A Ab B→A Ba C→B Bb A→B Ca B→C Ca C ※Col1に重複がある場合、重複結果の1行目のレコードをData2に入れる (今回の場合CをData2に入れる) Data1は固定で、Table1を使ってData2を上記の様に修正するSQLが書けなくて困っています。 Col1が重複してない場合の修正するSQLを書いてみましたが(合っているかはわかりませんが...)、 重複する場合のSQLも追加して最終的に1つのSQLで、すべて修正できるようにしたいです。 update Table2 T2  set Data2=  (select Col2 from Table1  where Col1=   (select Col1 from Table1 T1   where T2.Data1=T1.Col1   group by T1.Col1   having count(T1.Col1)=1  ) ) わかりにくい部分もあると思いますが、ご教授お願いします。

  • サブクエリを利用したSQL文から複数の抽出条件

    例えば、以下のようなサブクエリを利用したSQL文があります。 SELECT table_a.* FROM table_a LEFT JOIN (SELECT table_b.* FROM table_b LEFT JOIN table_c ON (table_b.id = table_c.bid) WHERE table_b.type='1') AS tbl ON (table_a.id = tbl.aid) このSQL文にWHERE句で条件を指定したいのですが、サブクエリで指定しているtblテーブルのvalueフィールドが「1」と「20」のものを抽出したいと思います。 WHERE (tbl.value='1' AND tbl.value='20') としても結果が帰って来ません。 これは、WHEREする条件の数だけ、サブクエリでテーブルを作って条件を指定するのでしょうか? 効率が悪そうなので、他の方法があるのではと思いご質問させて頂きました。 お分かりになる方がいれば、よろしくお願いします。

  • 集計関数の合計について

    お世話になります。 SQLSever2005を使用しています。 Count(*)で月毎のデータ件数を集計し、またその結果を出力するSQLを考えております。 SELECT  (SELECT Count(*) FROM TBL_TEST T1 WHERE T1.T_DATE>='2005/01/01' AND T1.T_DATE=<'2005/01/31') AS CNT_1,  (SELECT Count(*) FROM TBL_TEST T2 WHERE T2.T_DATE>='2005/02/01' AND T2.T_DATE=<'2005/02/31') AS CNT_2,   (SELECT Count(*) FROM TBL_TEST T3 WHERE T3.T_DATE>='2005/03/01' AND T3.T_DATE=<'2005/03/31') AS CNT_3,   (CNT_1+CNT_2+CNT_3) AS TOTAL_CNT ・・・・・・・・・・・・ (★)  FROM TBL_TEST T  WHERE ・・・・・・・・・ 結果(★)のところで『CNT_1は無効です』というエラーになってしまいます。 ちなみにAccessではエラーにならずに結果を出力していました。 上記のSQL文はどのように修正すればよろしいでしょうか?

  • カウントして抽出するsqlをまとめたい

    mysql初心者です。宜しくお願い致します。 PHP+Mysqlで以下のスクリプトを組んでいます。 変数aを一旦決めておき、カウント結果次第で変数aの値を広げるというものです。 これをSQL文一発にまとめたいのですが、可能でしょうか? mysqlのバージョンは5.1.34です。お詳しい方、ご教授お願い致します。 $a = 10; //仮に10 $query = "SELECT COUNT(*) AS cnt FROM mydb WHERE col_a BETWEEN ( 100 - $a ) AND ( 100 + $a ) AND col_b BETWEEN ( 100 - $a ) AND ( 100 + $a )"; $result = mysql_query($query); $row = mysql_fetch_array($result); if($row[cnt] < 10){$a = 20;} //件数が10件以下ならaの範囲を広げて結果取得 $query = "SELECT * FROM mydb WHERE col_a BETWEEN ( 100 - $a ) AND ( 100 + $a ) AND col_b BETWEEN ( 100 - $a ) AND ( 100 + $a )"; $result = mysql_query($query);

    • ベストアンサー
    • MySQL
  • <SQL>条件付きで最小値レコードを抽出する方法

    SQLite3.7.5を使っています。 以下<抽出前>の様なテーブルから、col2の値が"FALSE"で(col1=3,4,5の3つ)かつ、col3が最小値(col3=3)であるレコードを<抽出後>のように抽出するSQL文をご教示ください。 <抽出前> col1 | col2 | col3 1 | true | 3 2 | true | 0 3 |false | 3 4 |false | 5 5 |false | 3 <抽出後> col1 | col2 | col3 3 |false | 3 5 |false | 3 自分で考えたSQL文は以下です。 抽出結果は問題ないのですが、同じSELECT文を2回書いていてだいぶ効率悪いことをしているのではないかと思い質問しました。 よろしくお願い致します。 SELECT * FROM (SELECT * FROM test WHERE (col2 = false)) WHERE col3 = (SELECT min(col3) FROM (SELECT * FROM test WHERE (col2 = false)))

  • 1つのSQLにしたいです

    1つのSQLにしたいです 以下のSQLを1つにしたいです。 select a, b, c, '1' event_type from sample where type = '1' select a, b, c, '2' event_type from sample where type = '2' select a, b, c, '3' event_type from sample where type = '3' ポイントはselect分に結果によって'1'、'2'、'3'といれたいです。 初心者的質問で申し訳ありません。 よろしくお願いします。

    • ベストアンサー
    • MySQL