• ベストアンサー

年齢分布テーブルの再集計SQL

テーブルA 年齢,人数 20,15 21,11 22,26 .... 30,5 31,88 ... 60,5 上記テーブルAからのSQLで下記のデータが欲しいと思っております。 【欲しい結果】 年齢範囲,人数 20~24,50 25~29,33 30~34,199 ... ただし、 select '20~24'as 年齢範囲,count(*)as 人数 from テーブルA where 条件1 union select '25~29'as 年齢範囲,count(*)as 人数 from テーブルA where 条件2 union select '30~34'as 年齢範囲,count(*)as 人数 from テーブルA where 条件3 ... というSQLは使いたくないです。(テーブルAの記述が長めなので、同じものを複数記述したくないのです) また結果が 項目名:20~24,25~29,30~34,... レコード:50,33,199,... というのも遠慮したいです。 CASE文やsum、groupを使えば、できそうな気がするのですが、、、 ご教授お願い致します。

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

  • ベストアンサー
noname#140971
noname#140971
回答No.5

select substring('-----20~24/25~29/30~34', 分布区分*6, 5) AS 年齢範囲,Sum(人数) as 総数 FROM (select *, (年齢 / 5 - 3) as 分布区分 FROM 年齢分布) AS X GROUP BY X.分布区分; なにげなく、質問文にある Count関数を使っていました。 もちろん、Sum関数です。

dokkiricha
質問者

お礼

回答ありがとうございます。確かに「欲しい結果」になりました。 区分とsubstringとは思いもつきませんでした。 区分の考え方は今後のSQLライフに応用できると感じました。

その他の回答 (4)

  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.4

No1です 失礼します。間違いました。 SELECT  '20~24', SUM(CASE WHEN 年齢 >= 20 AND 年齢 <= 24 THEN 人数 END),      '25~29', SUM(CASE WHEN 年齢 >= 25 AND 年齢 <= 29 THEN 人数 END),      '30~34', SUM(CASE WHEN 年齢 >= 30 AND 年齢 <= 34 THEN 人数 END) FROM   テーブルA WHERE   条件1 AND 条件2 AND 条件3

dokkiricha
質問者

お礼

回答ありがとうございます。 この結果だと1レコードに、全ての年齢範囲および人数が載る形になりますね。 こうゆうデータが必要なときもあると思うので参考にさせていただきます。

noname#140971
noname#140971
回答No.3

<年齢分布> ID___区分__年齢___人数 1____1_______20______1 2____1_______21______1 3____2_______25______1 4____3_______34______1 5____3_______31______1 select substring('-----20~24/25~29/30~34', 区分*6, 5) AS 年齢範囲,count(*) as 人数 from 年齢分布 group by 区分; この SQL文の実行結果は次のようです。 ____|年齢範囲|人数| ____|_____________________ __1|20~24____|____2| __2|25~29____|____1| __3|30~34____|____2| と、列[区分]を付加するという解決方法です。 もちろん、 select substring('-----20~24/25~29/30~34', 分布区分*6, 5) AS 年齢範囲,count(*) as 人数 FROM (select *, (年齢 / 5 - 3) as 分布区分 FROM 年齢分布) AS X GROUP BY X.分布区分; でも同じ結果をえます。

回答No.2

SQL Serverは2000? 2005? テーブルAのデータ例では、20~22で52人いるが、欲しい結果で20~24が50人とは、何を求めた結果ですか? >項目名:20~24,25~29,30~34,... >レコード:50,33,199,... >というのも遠慮したいです。 母体件数がどのくらいあるのか分かりませんが、性能を重視するなら、上記のような検索の方が、速く行なえるかも知れませんよ?

dokkiricha
質問者

補足

お世話になります。 >SQL Serverは2000? 2005? 2000になります。 本件はSQL記述に関する質問であり、バージョンの違いによる問題発生はほぼ無いと考え、割愛致しました。 >テーブルAのデータ例では、20~22で52人いるが、欲しい結果で20~24が50人とは、何を求めた結果ですか? 失礼致しました。人数の記述を間違えました。 テーブルAは年齢毎の人数を表すもので、欲しい結果は年齢範囲に相応した年齢の人数の和になります。 >母体件数がどのくらいあるのか分かりませんが、 今回の母体件数は数百です。 >項目名:20~24,25~29,30~34,... >レコード:50,33,199,... >上記のような検索の方が、速く行なえるかも知れませんよ? UNIONの方法や上記のような方法で、欲しい情報を取得できることはわかっていました。 この「欲しい情報」に対して、私の思いつかない様々なアプローチ方法があるのでは? と思い、今回質問をあげさせていただきました。 データ件数が少ないこともあり、レスポンスは気にしておりませんでしたが、 「レスポンスを考慮した方法」というのも確かにアプローチ方法のひとつになりますね。

  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.1

こんにちは。 こんな感じで如何でしょうか。 SELECT  '20~24', SUM(CASE WHEN 年齢 >= 20 AND 年齢 <= 24 THEN 1 END),      '25~29', SUM(CASE WHEN 年齢 >= 25 AND 年齢 <= 29 THEN 1 END),      '30~34', SUM(CASE WHEN 年齢 >= 30 AND 年齢 <= 34 THEN 1 END) FROM   テーブルA WHERE   条件1 AND 条件2 AND 条件3

関連するQ&A

  • 複数テーブルの集計その2

    お世話になります。 先日テーブルの集計について教えていただき、下記集計結果を取得することができたのですが、 新たに自由形50~平泳ぎ50までの合計を追加したいのです。(一人で4種目参加する場合は4と数える) テーブル1 AreaID   AreaName --------------------- 1 北海道 2 東北 テーブル3 ID AreaID   Name  Item1   Item2  Item3 Item4 --------------------------------------------------------- 1   2    鈴木    2    1    4     3 2   1    田中    1    2    null   null 3   2    伊藤    3    null   2    4  「集計結果」       参加人数 自由形50 自由形100 背泳ぎ50 平泳ぎ50  追加部分 --------------------------------------------------------------- 北海道     1     1       1      0      0       2 東北      2     1       2      2      2       7   $sql="select AreaName, count(distinct ID) 参加人数, count(case when Item=1 then 1 else null end) as 自由形50, ・・・略 from t1 as x left join (select ID,AreaID,1 as Item from t3 where Item1=1 or Item2=1 or Item3=1 or Item4=1 union all select ID,AreaID,2 as Item from t3 where Item1=2 or Item2=2 or Item3=2 or Item4=2 ) as y on x.AreaID=y.AreaID group by AreaName order by x.AreaID というようにおしえていただきました。 null以外を取得するSQLをカウントとselectに追加すればいいのかと思い試したのですが期待した値を取得できません。 count(case when Item=AAA then 1 else null end) as abc,と union all select ID,AreaID,AAA as Item from テーブル3 where ItemID1<>'' or ItemID2<>'' or ItemID3<>'' or ItemID4<>'' or (ItemID1<>'' and ItemID2<>'') ・・・ バージョンはMySQL4.1.18です。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • データの件数を集計するための SQL

    データの件数を集計するための SQL について教えてください。 例えば以下のようなテーブルがあります。 ▼テーブル 名前 |交通手段|日付 -----+--------+---- Aさん|バス |5/1 Aさん|バス |5/2 Aさん|バス |5/3 Bさん|バス |5/1 Bさん|電車 |5/2 ※「日付」については、本質問に直接の関係はありません。 このテーブルにクエリを発行して、以下の結果を取得したいと考えています。 ▼取得したい結果 名前 |交通手段|回数 -----+--------+---- Aさん|バス |3 Bさん|バス |1 Bさん|電車 |1 当方がイメージしている流れは以下の通りです。 SQL は苦手でして、これをひとつにまとめることができません。 1) GROUP BY で束ねる SELECT 名前, 交通手段 FROM テーブル GROUP BY 名前, 交通手段 2) 1)の結果の1件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Aさん' AND 交通手段='バス' 3) 1)の結果の2件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Bさん' AND 交通手段='バス' 4) 1)の結果の3件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Bさん' AND 交通手段='電車' なおレンタルサーバ上 (MySQL 5.0.77) で稼働させるため、 なるべく高速な SQL を希望いたします。

    • ベストアンサー
    • MySQL
  • MySQL: 複数テーブルのcount

    複数テーブルの総行数(count値)を取得したいのですが、下記だとテーブルA,B,Cの結果が バラバラに出力されてしまいます。 【入力条件】 mysql> select COUNT(*) AS 列ID from テーブルA      union all      select COUNT(*) AS 列ID from テーブルB      union all      select COUNT(*) AS 列ID from テーブルC; 【出力結果】       +-----+       | 列_ID |       +-----+       |  1  | ←テーブルAの合計:行数       |  2  | ←テーブルBの合計:行数       |  3  | ←テーブルCの合計:行数       +-----+ 総行数:6を一発で取得するには、どのようにしたらよろしいのでしょうか? 大変恐縮ですが、ご教授よろしくお願いいたいます。 <<MySQLのverは5,5です。

    • ベストアンサー
    • MySQL
  • テーブルのマージSQLに関して

    初歩的なSQLの質問で申し訳ありません。 以前にも同じような内容で投稿させて頂きましたが、教えて下さい。 下記のような、ある異なる名前の同項目を持つ2つのテーブルが存在します。 《テーブル》 Aテーブル   社員番号、日付、内容、所属、時間、結果 Bテーブル  社員番号、日付、内容、理由  ※ 内容に関しては、AテーブルとBテーブルで全く違います。 これらの2つのテーブルをマージさせ、社員番号毎の内容毎、日付順に したいと考えています。 以前に以下のようなUNIONを教えてもらいましたが、所属、時間、結果、理由という 項目全てを出力するとした場合、どのように記載すれば良いでしょうか? UNIONの場合、項目が異なるとエラーとなってしまうかと、、、 《UNIONのSQL》 SELECT * FROM ( SELECT 社員番号, 日付, 内容 FROM Aテーブル UNION SELECT 社員番号, 日付, 内容 FROM Bテーブル ) ORDER BY 日付, 社員番号, 内容 教えて下さい。 よろしくお願いします。

  • Accessユニオンクエリーで2つのテーブルを集計

    Accessのユニオンクエリーで2つのテーブルを集計したいのですが Aテーブル コード1 値 1    5 1    2 Bテーブル コード2 値 1    1 2    3 結果 コード 値 1    8 2    3 このような結果を得ることは出来ますでしょうか? SELECT Aテーブル.コード1 AS コード,Aテーブル.値 UNION SELECT Bテーブル.コード2 AS コード,Bテーブル.値 このように記述すると コード 値 1    5 1    2 1    1 2    3 このような結果になってしまうのですが・・

  • 同じテーブルでのUNION

    テーブルtableである列aのデータが1,2,3,4,5,6,7,8,9と 入っていたとします。 このテーブルを1,2,5,3,4,6,7,8,9という順番で SELECTしたい場合はどのようにすればよろしいでしょうか? select a from table where a IN (1,2) union select a from table where a = 5 union select a from table where a NOT IN (1,2,5) としてみたのですが1,2,3,4,5,6,7,8,9と表示されてしまいます。 宜しくお願いいたします。

  • こういう場合の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 です。 なお、家に検証環境が無いので、検証&お礼は明日のお昼くらいになると思います。 宜しくお願い致します。

  • テーブル結合について、下記SQLをANSI結合の書き方で表したい。

    テーブル結合について、下記SQLをANSI結合の書き方で表したい。 select * from (select key from A union select key from B union select key from C) X, A,B,C where X.key=A.key(+) and X.key=B.key(+) and X.key=C.key(+) このSQLをANSI結合の記述で書きたいのですが、 (+)での結合文になれておらず試行錯誤しております。 下記のようなのかなとは模索しておりますが、 手元に実行環境がなくわかりません。 また、要所気付く点などありましたら、ご指摘願います。 select A.*, B.*, C.* from (select key from A union select key from B union select key from C) X, LEFT JOIN A ON X.key=A.key LEFT JOIN B ON X.key=B.key LEFT JOIN C ON X.key=C.key

  • SQL WHERE文のノットイコールについて

    初歩的な質問ですみません。 Oracle9iでsqlplusで接続しています。 「member_accountテーブルのdelete_flag(VARCHAR2)カラムの値が'1'ではない」ものを抽出したいと考えてます。 ただ、正しい結果が返ってきません。 何が問題でしょうか?よろしくお願いいたします。 ============================================================ SQL> select count(ID) from member_account; COUNT(ID) ---------- 16450 SQL> SQL> select count(ID) from member_account where delete_flag='1'; COUNT(ID) ---------- 107 SQL> SQL> select count(ID) from member_account where delete_flag<>'1'; COUNT(ID) ---------- 0 SQL> SQL> select count(ID) from member_account where delete_flag!='1'; COUNT(ID) ---------- 0 ============================================================ よろしくお願いいたします。

  • 集計のSQLをお教え下さい

    初心者ですよろしくお願いします。 以下の様なテーブルがあり、年月と場所コードで 件数を出したいと考えております。 申し訳ありませんが、SQLの記述をお教え下さい。 年月日 | 場所コード |  20060510   1000 20060511   1000 20060511   2000 20060512   2000 20060601   1000 20060601   2000   ・    ・    ↓ 年月日 | 場所コード | count 200605   1000      2 200605   2000      2 200606   1000      1 200606   2000      1 年月日を年月にして集計したいと考えています。 select 年月日,場所コード,count(*) from table group by substring(年月日 from 1 for 6) ではうまくいきませんでした・・・ よろしくお願いします。

    • ベストアンサー
    • MySQL