プロが教える店舗&オフィスのセキュリティ対策術

テーブル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を使えば、できそうな気がするのですが、、、
ご教授お願い致します。

A 回答 (5件)

こんにちは。


こんな感じで如何でしょうか。

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
    • good
    • 0

SQL Serverは2000? 2005?



テーブルAのデータ例では、20~22で52人いるが、欲しい結果で20~24が50人とは、何を求めた結果ですか?

>項目名:20~24,25~29,30~34,...
>レコード:50,33,199,...
>というのも遠慮したいです。

母体件数がどのくらいあるのか分かりませんが、性能を重視するなら、上記のような検索の方が、速く行なえるかも知れませんよ?

この回答への補足

お世話になります。

>SQL Serverは2000? 2005?
2000になります。
本件はSQL記述に関する質問であり、バージョンの違いによる問題発生はほぼ無いと考え、割愛致しました。

>テーブルAのデータ例では、20~22で52人いるが、欲しい結果で20~24が50人とは、何を求めた結果ですか?
失礼致しました。人数の記述を間違えました。
テーブルAは年齢毎の人数を表すもので、欲しい結果は年齢範囲に相応した年齢の人数の和になります。

>母体件数がどのくらいあるのか分かりませんが、
今回の母体件数は数百です。

>項目名:20~24,25~29,30~34,...
>レコード:50,33,199,...
>上記のような検索の方が、速く行なえるかも知れませんよ?
UNIONの方法や上記のような方法で、欲しい情報を取得できることはわかっていました。
この「欲しい情報」に対して、私の思いつかない様々なアプローチ方法があるのでは?
と思い、今回質問をあげさせていただきました。
データ件数が少ないこともあり、レスポンスは気にしておりませんでしたが、
「レスポンスを考慮した方法」というのも確かにアプローチ方法のひとつになりますね。

補足日時:2007/08/08 18:09
    • good
    • 0

<年齢分布>



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.分布区分;

でも同じ結果をえます。
    • good
    • 0

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/08/07 16:00

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関数です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/08/07 15:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!