Группа SQL по возрасту - PullRequest
       18

Группа SQL по возрасту

7 голосов
/ 06 января 2012

SQL 2005, у меня есть таблица со столбцом 'ages_c', мне нужно сгруппировать записи по возрастным диапазонам.Это запрос, который я нашел на этом сайте, и он дает мне 90%, но 'group by' содержит ошибку, * Неверное имя столбца '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

Спасибо.

Ответы [ 5 ]

12 голосов
/ 06 января 2012

Попробуйте вместо этого:

 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
8 голосов
/ 06 января 2012

Группировать по 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, так как это единственное предложение, которое выполняется после , вычисляется набор столбцов.

0 голосов
/ 16 июня 2019

Если ваша база данных поддерживает синтаксис 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
0 голосов
/ 06 января 2012

Вы не можете группировать по столбцу, который вы создали в запросе. Вам придется сделать это так:

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

или 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
0 голосов
/ 06 января 2012

Это ваш настоящий код, который вы используете?Это не похоже на то, потому что вы пропустили пробел между 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

Не забудьте удалить временную таблицу, когда закончитеон

...