SQL 2005、「ages_c」列のテーブルがあります。レコードを年齢範囲でグループ化する必要があります。これは私がこのサイトで見つけたクエリであり、90%がそこにありますが、「groupby」でエラーが発生しています。*無効な列名「age_range」*
select
case
when age_c <18 then 'Under 18'
when age_c between 18 and 24 then '18-24'
when age_c between 25 and 34then '25-34'
END as age_range,
Count(*) as count
from contacts
group by age_range
order by age_range
'age_c'でグループ化して注文すると、結果は次のようになります。
Under 18 1
18-24 1
18-24 1
25-34 1
私が欲しいのは:
Under 18 1
18-24 2
25-34 1
ありがとう。
代わりに次のようにしてみてください。
SELECT SUM(CASE WHEN age_c < 18 THEN 1 ELSE 0 END) AS [Under 18],
SUM(CASE WHEN age_c BETWEEN 18 AND 24 THEN 1 ELSE 0 END) AS [18-24],
SUM(CASE WHEN age_c BETWEEN 25 AND 34 THEN 1 ELSE 0 END) AS [25-34]
FROM contacts
age_c
でグループ化-age_rangeは物理的な列ではありません。より具体的には、これを行います。
group by case
when age_c <18 then 'Under 18'
when age_c between 18 and 24 then '18-24'
when age_c between 25 and 34then '25-34'
END
age_range
はエイリアス列であるため、group by
はそれをまったく認識していません。グループ化は、列セットが計算される前に行われます。エイリアスを使用できる唯一の句はorder by
です。これは、実行される唯一の句であるためですafter列セットが計算されます。
それはあなたが使用している実際のコードですか? 34からそれまでの間にスペースがないため、そのようには見えません。そのコードはSQLでエラーになります。実際の変更されていないクエリを共有してもよろしいですか?
とにかく、一時テーブルまたはネストされたクエリを使用できます。
SELECT
CASE
WHEN age_c <18 THEN 'Under 18'
WHEN age_c BETWEEN 18 AND 24 THEN '18-24'
WHEN age_c BETWEEN 25 AND 34 THEN '25-34'
END AS age_range,
INTO #TempAges
FROM contacts
ORDER BY age_c
SELECT COUNT(*) FROM #TempAges GROUP BY age_range
使い終わったら、一時テーブルを削除することを忘れないでください
データベースがFILTER WHERE構文をサポートしている場合、これは非常に洗練された方法でアーカイブできます。
SELECT COUNT(id) FILTER (WHERE (age < 18)) AS "Under 18",
COUNT(id) FILTER (WHERE (age >= 18 AND age <= 24)) AS "18-24",
COUNT(id) FILTER (WHERE (age >= 25 AND age <= 34)) AS "25-34"
FROM contacts
またはそうでない場合はこれ:
SELECT count(CASE WHEN (age < 18) THEN id ELSE null END) AS "Under_18",
count(CASE WHEN (age >= 18 AND age <= 24) THEN id ELSE null END) AS "18-24",
count(CASE WHEN (age >= 25 AND age <= 34) THEN id ELSE null END) AS "25-34"
FROM contacts
クエリで作成した列でグループ化することはできません。あなたはこのようにそれをしなければならないでしょう:
SELECT count(*), * FROM
(
select
case
when age_c <18 then 'Under 18'
when age_c between 18 and 24 then '18-24'
when age_c between 25 and 34then '25-34'
END as age_range
from contacts
) t
group by age_range
order by age_range
またはGROUPBY
case
when age_c <18 then 'Under 18'
when age_c between 18 and 24 then '18-24'
when age_c between 25 and 34then '25-34'
END