Случай, когда сортировать EGN по возрастным группам - PullRequest
0 голосов
/ 14 апреля 2020

Как использовать случай, когда сортировать группы по возрасту 0-18,18-30,30-40, используя их EGN. Может быть, использовать что-то вроде >87______, например EGN 8607051914, это должно быть в группе 30-40.

1 Ответ

0 голосов
/ 14 апреля 2020

Это конкретный c расчет, потому что EGN, похоже, является болгарским числом граждан. Важной частью для расчета является то, что первые шесть цифр соответствуют дате рождения, но номер месяца закодирован:

  • для даты рождения между 01/01/1900 и 31/12/1999 месяц остается тем же
  • для даты рождения до того, как 01/01/1900 20 добавлено к месяцу,
  • для даты рождения между 01/01/2000 и 31/12/2099, 40 добавлено к месяцу :

Возможен следующий подход:

Таблица:

CREATE TABLE Data (egn varchar(10))
INSERT INTO Data (egn) VALUES ('8607051914')

Таблица:

SELECT 
    egn,
    CASE 
        WHEN 0 <= age AND age < 18 THEN '0-18'
        WHEN 18 <= age AND age < 30 THEN '18-30'
        WHEN 30 <= age AND age < 40 THEN '30-40'
        ELSE '40+'
    END AS age
FROM (
    SELECT 
        egn,
        DATEDIFF(
            year,
            DATEFROMPARTS(
                CASE 
                    WHEN SUBSTRING(egn, 3, 2) BETWEEN '21' AND '32' THEN '18' + SUBSTRING(egn, 1, 2) 
                    WHEN SUBSTRING(egn, 3, 2) BETWEEN '41' AND '52' THEN '20' + SUBSTRING(egn, 1, 2) 
                    ELSE '19' + SUBSTRING(egn, 1, 2) END, 
                CASE 
                    WHEN SUBSTRING(egn, 3, 2) BETWEEN '21' AND '32' THEN SUBSTRING(egn, 3, 2) - 20
                    WHEN SUBSTRING(egn, 3, 2) BETWEEN '41' AND '52' THEN SUBSTRING(egn, 3, 2) - 40
                    ELSE SUBSTRING(egn, 3, 2) END, 
                SUBSTRING(egn, 5, 2)
            ),
            GETDATE()
        ) AS age
    FROM Data
) t

Результат:

egn         age
8607051914  30-40
...