@Whey

Можно ли сохранить последовательность вывода полей?

Всем доброго времени суток. У меня задача вывести количество сотрудников, как в таблице ниже:
5e8ffcdec0cfa085060979.png
Я написал запрос на выборку, но поля, которые не подходят ни под одно из условий не выводятся совсем. Можно сделать вывод каждого поля, но если записи не найдены, то выводится значение 0?
И второй вопрос. Можно ли сохранить последовательность вывода полей по порядку, как на изображении выше?
Вот SQL запрос:
SELECT 
CASE
WHEN YEAR(BIRTHDAY) >= 2000 THEN 'от 2000'
WHEN YEAR(BIRTHDAY) >= 1990 AND YEAR(BIRTHDAY) <= 1999 THEN '1999-1990'
WHEN YEAR(BIRTHDAY) >= 1980 AND YEAR(BIRTHDAY) <= 1989 THEN '1989-1980'
WHEN YEAR(BIRTHDAY) >= 1970 AND YEAR(BIRTHDAY) <= 1979 THEN '1979-1970'
WHEN YEAR(BIRTHDAY) < 1970 THEN 'Ранее 1970'
ELSE 'Нет данных'
END 'Год рождения',
COUNT(*) 'Кол-во сотрудников' FROM prepod GROUP BY 1;

Вывод на экран:
5e8ffd7c6df63368649394.png
  • Вопрос задан
  • 87 просмотров
Решения вопроса 1
@alexalexes
Все таки сделайте динамически формируемым данные об интервалах, то есть inters можно представить в виде таблицы или генерировать на основе prepod.
Для "нет данных" можно определить интервал [null, null]:
select case
         when a.begin is null and a.end is null then 'нет данных'
         when a.begin is not null and a.end is not null then concat(a.end, '-', a.begin)
         when a.begin is null and a.end is not null then concat('ранее ', a.end + 1)
         when a.begin is not null and a.end is null then concat('от ', a.begin)
       end interval_str,
       cnt
from
(
select inters.begin, inters.end, count(prepod.name) cnt
from
(
  select null begin, 1969 end union all
  select 1970 begin, 1979 end union all
  select 1980 begin, 1989 end union all
  select 1990 begin, 1999 end union all
  select 2000 begin, null end union all
  select null begin, null end -- запись для тех, у кого нет данных др.
) inters -- таблица с интервалами
left join 
(
  select 'a' name, STR_TO_DATE('2013-02-11', '%Y-%m-%d') date_r union all
  select 'aa' name, STR_TO_DATE('2010-09-01', '%Y-%m-%d') date_r union all
  select 'b' name, STR_TO_DATE('1968-02-11', '%Y-%m-%d') date_r union all
  select 'bb' name, STR_TO_DATE('1969-01-21', '%Y-%m-%d') date_r union all
  select 'c' name, STR_TO_DATE('1980-02-11', '%Y-%m-%d') date_r union all
  select 'd' name, STR_TO_DATE('1989-02-11', '%Y-%m-%d') date_r union all
  select 'z' name,  null date_r -- препод, у которого нет данных др.
) prepod on inters.begin <= year(prepod.date_r) and inters.end >= year(prepod.date_r)
         or inters.begin is null and inters.end >= year(prepod.date_r)
         or inters.begin <= year(prepod.date_r) and inters.end is null
         or prepod.date_r is null and inters.begin is null and inters.end is null
group by inters.begin, inters.end
order by inters.begin desc, inters.end desc
) a
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
BasiC2k
@BasiC2k
.NET developer (open to job offers)
Для тех, которые не найдены - надо чуть видоизменить запрос. Вместо
COUNT(*) 'Кол-во сотрудников'
Напишите
IF(ISNULL(BIRTHDAY), 0, COUNT(BIRTHDAY)) AS 'Кол-во сотрудников'
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы