• ベストアンサー

年齢分布テーブルの再集計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