1

とりわけ、各年齢を含む顧客のデータベーステーブルがあります。

顧客にクエリを実行し、年齢層別に並べ替えて、次のような結果を得たいと考えています。

Age_Group   Num_Of_Cust 
 0-10        Count 
 10-20       Count 
 20-30       Count 

これは単一のクエリで実行できますか? 私は基本的に、テーブルの行の値を挿入し、2 番目の列でその年齢層の人数を数えたいと考えています。

4

3 に答える 3

2

次のようなものを試してください

select age / 10, count(*) from table_name group by age / 10 order by age / 10;

これにより、最初にグループ化された年齢の10の列を含み、次にその範囲の数を含む行の結果が得られます。範囲は実際には0〜9、10〜19などになります。シフトアップしたい場合は、に置き換えることができageます(age-1)。顧客を含まない範囲もスキップすることに注意してください。

要求された出力をより正確に再現するために-ただし、すべてのRDBMS(PostgreSQLでテスト済み)で機能するとは限らない場合は、以下を使用できます。

select concat(Age*10, '-', Age*10+9) as Age_Group, Num_of_Cust from (
    select age / 10 as Age, count(*) as Num_Of_Cust from test
        group by age / 10 order by age / 10) as X;

(副選択は好きではありませんが、正しい順序とラベルを取得する必要があるようです。順序Age_Group自体は、たとえば20-29の前に100-109になります。キャストしようとすると、Age_GroupPostgreSQLは列ではないと抗議します。最後as Xはまた、サブクエリにエイリアスが必要であるという苦情を排除する必要がありました。)

于 2012-12-03T20:48:09.987 に答える
1

簡単なcaseステートメントでうまくいきます。

select agegroup, count(*)
from (select (case when age <= 10 then '00-10'
                   when age <= 20 then '11-20'
                   when age <= 30 then '21-30'
                   else '31+'
              end) as agegreoup, t.*
      from t
     ) t
group by agegroup

私は他のすべての人のための最後のグループを含めました(そして年齢が決して負になることはないと仮定しました)。また、「0-10」ではなく「00-10」を使用したため、すべてのグループ名の長さが同じになります。サブクエリは厳密には必要ありません。私はそれがより読みやすいと思います。

于 2012-12-03T20:51:10.880 に答える
0

私はこのようなことをします:

SELECT
  Coalesce(case when age<10 then '0-9' end,
           case when age between 10 and 20 then '10-20' end,
           case when age>20 then '>20' end) As Age_Group,
  Count(*)
From your_table
Group by Age_Group
于 2012-12-03T20:44:03.357 に答える