2009-05-12 13 views
4

私は、PersonAgeと呼ばれるフィールドを含むPersonというテーブルを持っています。私は年齢帯、すなわち'12歳以下 '、'13 -17歳、18歳-25歳、25歳以上'の年齢をグループ化し、ストアドプロシージャを使用してこの結果セットを返す必要があります。SQL年齢バンドを返すためのストアドプロシージャの作成

は、理想的には私は、単純なUNIONが十分でなければならないので、

Age band   Total 
12 and under  5 
13 - 17   8 
18 - 25   7 
25 and over  10 
+0

@Mich、「18-25」と「25歳以上」の年齢帯が重なっています。 –

+0

@ Lieven Lievenさんが見つけたのは、遅くて夜のことだったのですが(それは私の言い訳です!)、私はそれが生産コードにないことを保証することができます... – Mitch

答えて

13

あなたのバンドを含むテーブルを作成します。

CREATE TABLE agebands 
(
    id INT NOT NULL PRIMARY KEY, 
    lower_bound INT NOT NULL, 
    upper_bound INT NOT NULL 
) 
CREATE INDEX IDX_agebands_bounds ON (lower_bound, upper_bound) 

次に、あなたのデータを移入:

INSERT INTO agebands VALUES (1, 0, 12) 
INSERT INTO agebands VALUES (2, 13, 17) 
INSERT INTO agebands VALUES (3, 18, 24) 
INSERT INTO agebands VALUES (4, 25, 199) 

そして、それに参加する:

SELECT 
    lower_bound, upper_bound, 
    COUNT(*) AS number_of_people 
FROM 
    persons 
    INNER JOIN agebands 
     ON person_age BETWEEN lower_bound AND upper_bound 
GROUP BY 
    lower_bound, upper_bound 
ORDER BY 
    lower_bound 

これは、することができますバンド調整の柔軟性s。もちろん、ここでUNIONを使用する他の答えも使えます。これは、データベースに別のテーブルを追加する/できないようにするとより適切です。次

+0

+1フレキシブル – Scoregraphic

+0

+1ニート、この簡単な例では、組合が余分なテーブルを維持する方が簡単だと主張していますが。 1年後には、ソース・プロシージャを読まずにテーブル内のレコードを追加、削除、または変更するだけでよいことを誰も覚えていません。 –

+0

+1これは、ユニオンベースの回答よりも効率的でメンテナンス性が高い –

4

のように2つのフィールド、「年齢バンド」、「合計」が返さ取得する必要があります。

SELECT [Ageband] = '12 and under', COUNT(*) 
FROM dbo.Person 
WHERE PersonAge <= 12 
UNION ALL SELECT '13-17', COUNT(*) 
FROM dbo.Person 
WHERE PersonAge BETWEEN 13 AND 17 
UNION ALL SELECT '18-25', COUNT(*) 
FROM dbo.Person 
WHERE PersonAge BETWEEN 18 AND 25 
UNION ALL SELECT '26 and over', COUNT(*) 
FROM dbo.Person 
WHERE PersonAge >= 26 
2

は与える必要があります:あなたは列の別名でグループすることはできませんSQLで

select count(*), person_age 
from (
    select (case 
       when age between 0 and 12 then '12 and under' 
       when age between 13 and 17 then '13-17' 
       when age between 18 and 25 then '18-15' 
       else 'Above 25' 
      end) as 'person_age' 
    from person) 
group by person_age 
+0

現在の状態では、これはコンパイルされませんが、動作させることができます... –

0
declare @tempT table(age int) 
declare @temp2 table(age2 varchar(15)) 

insert into @tempT(age) values(1) 
insert into @tempT(age) values(2) 
insert into @tempT(age) values(3) 
insert into @tempT(age) values(4) 
insert into @tempT(age) values(5) 
insert into @tempT(age) values(6) 
insert into @tempT(age) values(7) 
insert into @tempT(age) values(8) 
insert into @tempT(age) values(9) 
insert into @tempT(age) values(10) 
insert into @tempT(age) values(11) 

insert into @Temp2 
select case 
when age < 3 then '<3' 
when age >= 3 and age < 5 then '>= 3 and < 5' 
when age >= 5 then '>=5' 
end 
from @tempT 

select count(*), age2 from @Temp2 
GROUP BY age2 
1

を。このようなcase文を繰り返す必要があります。

select count(*), 
case 
    when aged between 0 and 12 then '12 and under' 
    when aged between 13 and 17 then '13-17' 
    when aged between 18 and 25 then '18-15' 
    else 'Above 25' end 
from person 
group by 
case 
    when aged between 0 and 12 then '12 and under' 
    when aged between 13 and 17 then '13-17' 
    when aged between 18 and 25 then '18-15' 
    else 'Above 25' 
end 
関連する問題