Допустим, есть такой запрос: <br/> <br/> <pre><code class="sql">select case when id in (1,2,3,4) then 'Начальная школа'
Если вы хотите сгруппировать строки по результату CASE — да, это обычная задача. Ниже — несколько вариантов, как это сделать корректно и удобно.
Предположим, есть таблица students(id, name, ...) и вы хотите сгруппировать по уровням школ:
1) Прямо в одном запросе (стандартный SQL — повторить CASE в GROUP BY)
```
select
case
when id in (1,2,3,4) then 'Начальная школа'
when id in (5,6,7,8) then 'Средняя школа'
when id in (9,10) then 'Старшая школа'
else 'Другие'
end as school_level,
count(*) as cnt
from students
group by
case
when id in (1,2,3,4) then 'Начальная школа'
when id in (5,6,7,8) then 'Средняя школа'
when id in (9,10) then 'Старшая школа'
else 'Другие'
end
order by cnt desc;
```
2) Через подзапрос — удобнее, чтобы не дублировать CASE:
```
select school_level, count(*) as cnt
from (
select id,
case
when id in (1,2,3,4) then 'Начальная школа'
when id in (5,6,7,8) then 'Средняя школа'
when id in (9,10) then 'Старшая школа'
else 'Другие'
end as school_level
from students
) t
group by school_level
order by cnt desc;
```
3) Альтернативный приём — агрегат с условием без GROUP BY по выражению:
```
select
sum(case when id in (1,2,3,4) then 1 else 0 end) as primary_cnt,
sum(case when id in (5,6,7,8) then 1 else 0 end) as middle_cnt,
sum(case when id in (9,10) then 1 else 0 end) as senior_cnt
from students;
```
Замечания:
- В некоторых СУБД (MySQL, PostgreSQL и др.) можно использовать alias в GROUP BY (group by school_level) или сокращённо group by 1; в стандарте SQL предпочтительнее повторять выражение или использовать подзапрос.
- Если под "выборкой" вы имели в виду sampling (например, случайная выборка строк), уточните СУБД — синтаксис отличается (TABLESAMPLE, ORDER BY random() LIMIT N и т.п.).
Скажите, чего именно хотите добиться (пример данных и ожидаемый результат) и какую СУБД используете — подстрою пример под ваш случай.
Делайте вместо <br/> <code class="sql">COUNT(*)</code> <br/> подзапрос. <br/> <pre><code class="sql">SELECT
case when id in (1,2,3,4) then 'Начальная школа'
when id in (5,6,7,8,9) then 'Средняя школа'
when id in (10,11) then 'Старшая школа'
end AS Class_type,
(
SELECT COUNT(*)
FROM class cc
WHERE (
case when сс.id in (1,2,3,4,5) then 'Начальная школа'
when cc.id in (6,7,8,9) then 'Средняя школа'
when cc.id in (10,11) then 'Старшая школа'
) = (
case when c.id in (1,2,3,4) then 'Начальная школа'
when c.id in (5,6,7,8,9) then 'Средняя школа'
when c.id in (10,11) then 'Старшая школа'
)
),
SUM(case when s.ocenka>4 then 1 end) AS 'Отличники'
FROM class c
GROUP BY Class_type</code></pre> <br/> Как-то так через задницу. Запутано. Не проверял, нет файрбёрда под рукой
По описанию не понятно кто на ком стоял =) <br/> <br/> <pre><code class="sql">select Class_type, count(1) over (partition by case when Class_type = 'HZ' then 'Начальная школа' else Class_type end) cnt, sum(for_sum) over (partition by case when Class_type = 'HZ' then 'Средняя школа' else Class_type end) sum_ from ( select case when id in (1,2,3,4) then 'Начальная школа' when id = 5 then 'HZ' when id in (6,7,8,9) then 'Средняя школа' when id in (10,11) then 'Старшая школа' end Class_type, case when s.ocenka>4 then 1 else 0 end for_sum from class c ) t group by Class_type having Class_type <> 'HZ'</code></pre> <br/> <br/> Если хотите что-то более вразумительное, дайте пример данных и результат который Вы хотели бы получить (будет понятнее)