@dflbrhekbn

Как правильно записать SQL запрос?

Есть две таблицы : db_person со столбцами id, stat
db_person_fio cо столбцами id_person, dr(дата рождения), w(1- мужчина, 2 - женщина)
Нужно составить запрос который будет показывать сколько есть в базе человек для каждого w (мужчина , женщина) с интервалом в 10 лет, и stat > 0 .Например :
Мужчин Женщин
0-10 1000 548
11-21 4564 8944
и так далее
  • Вопрос задан
  • 1054 просмотра
Пригласить эксперта
Ответы на вопрос 2
idShura
@idShura
MySQL:
SELECT T.YEAR,
         SUM (CASE WHEN T.W = 1 THEN 1 ELSE 0 END) AS MEN,
         SUM (CASE WHEN T.W = 2 THEN 1 ELSE 0 END) AS WOMEN
    FROM (SELECT (YEAR(CURRENT_DATE) - YEAR(F.DR)) DIV 10 * 10 AS YEAR, F.W
            FROM DB_PERSON AS P LEFT JOIN DB_PERSON_FIO AS F ON P.ID = F.ID_PERSON
           WHERE P.STAT > 0) AS T
   
GROUP BY T.YEAR
ORDER BY T.YEAR;


Шаг в 10 лет:

1) YEAR(CURRENT_DATE) - YEAR(F.DR) - из текущей даты вычитаем дату рождения чтобы получить количество лет. (не учитывая месяцы и дни по этому такой способ не очень точный)
2) DIV 10 * 10 - делим без остатка на 10 и затем умножаем снова на 10 чтобы получить шаг в 10 лет.

Немного изменил:

SELECT T.YEAR,
         SUM (CASE WHEN T.W = 1 THEN 1 ELSE 0 END) AS MEN,
         SUM (CASE WHEN T.W = 2 THEN 1 ELSE 0 END) AS WOMEN
    FROM (SELECT (DATE_FORMAT(FROM_DAYS(TO_DAYS(CURRENT_DATE) - TO_DAYS(F.DR)), '%Y') + 0) DIV 10 * 10 AS YEAR, 
                 F.W
            FROM DB_PERSON AS P LEFT JOIN DB_PERSON_FIO AS F ON P.ID = F.ID_PERSON
           WHERE P.STAT > 0) AS T
GROUP BY T.YEAR
ORDER BY T.YEAR;
Ответ написан
@JuniorNoobie
Сижу в поддержке, пишу мелкие проекты
Синтаксис MySQL.
Вот структура таблиц и запрос. Еще нужно создать дополнительную таблицу для возрастов.
CREATE TABLE db_person
(
id integer,
stat integer
);

CREATE TABLE db_person_fio
(
id_person integer,
dr date,
w integer
);

CREATE TABLE db_person_ages
(
age integer
);

INSERT INTO db_person_ages(age) VALUES (0);
INSERT INTO db_person_ages(age) VALUES (1);
INSERT INTO db_person_ages(age) VALUES (2);
INSERT INTO db_person_ages(age) VALUES (3);
INSERT INTO db_person_ages(age) VALUES (4);
INSERT INTO db_person_ages(age) VALUES (5);
INSERT INTO db_person_ages(age) VALUES (6);
INSERT INTO db_person_ages(age) VALUES (7);
INSERT INTO db_person_ages(age) VALUES (8);
INSERT INTO db_person_ages(age) VALUES (9);
INSERT INTO db_person_ages(age) VALUES (10);

SELECT CONCAT(age*11,'-',age*11+10) as descr,
	   IFNULL(man,0) as man,
       IFNULL(woman,0) as woman
FROM db_person_ages ages
LEFT JOIN 
(
SELECT FLOOR(timestampdiff(YEAR,f.dr,CURRENT_DATE)/11) as diff,
	   SUM(CASE WHEN f.w=1 THEN 1 ELSE 0 END) as man,
       SUM(CASE WHEN f.w=0 THEN 1 ELSE 0 END) as woman
FROM db_person p, db_person_fio f
WHERE p.id = f.id_person
AND p.stat>0
GROUP BY 1
) t ON ages.age = t.diff
Ответ написан
Ваш ответ на вопрос

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

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