Получение последнего оплаченного месяца для пользователей, использующих хранимую процедуру mysql - PullRequest
0 голосов
/ 15 октября 2019

У меня есть таблица для ввода платежа, как показано ниже

id   cust_id    mnth    year    amount
--   -------    ----    ----    -----
1     250        1       2       1200

2     300        1,2     2       2400

3     450        12      3       1200

4     450        1       4       1200

5     300        3       2       1200

6     455        1       3       1200

..etc

Получение месяца и года из другой таблицы, как показано ниже.

id     mnth

1       January

2       February

...etc

id   year 

1    2016

2    2017

3    2018

...etc

Я хочу получить последний оплаченный месяц и год из первой таблицы. Как это сделать

1 Ответ

1 голос
/ 15 октября 2019

Вы храните месяцы CSV в столбце mnth, что не является оптимальным дизайном таблицы. По крайней мере, вы должны хранить каждый месяц в отдельной строке, еще лучше будет просто хранить одну дату для каждого платежа. Вот один из способов ответить, учитывая текущий дизайн:

SELECT
    p1.id,
    p1.cust_id,
    p1.mnth,
    p1.year,
    p1.amount
FROM
(
    SELECT id, cust_id, mnth, year, amount,
        CASE WHEN CONCAT('%,', mnth, ',%') LIKE '%,12,%' THEN 12
             WHEN CONCAT('%,', mnth, ',%') LIKE '%,11,%' THEN 11
             WHEN CONCAT('%,', mnth, ',%') LIKE '%,10,%' THEN 10
             WHEN CONCAT('%,', mnth, ',%') LIKE '%,9,%' THEN 9
             WHEN CONCAT('%,', mnth, ',%') LIKE '%,8,%' THEN 8
             WHEN CONCAT('%,', mnth, ',%') LIKE '%,7,%' THEN 7
             WHEN CONCAT('%,', mnth, ',%') LIKE '%,6,%' THEN 6
             WHEN CONCAT('%,', mnth, ',%') LIKE '%,5,%' THEN 5
             WHEN CONCAT('%,', mnth, ',%') LIKE '%,4,%' THEN 4
             WHEN CONCAT('%,', mnth, ',%') LIKE '%,3,%' THEN 3
             WHEN CONCAT('%,', mnth, ',%') LIKE '%,2,%' THEN 2
             WHEN CONCAT('%,', mnth, ',%') LIKE '%,1,%' THEN 1 END AS mnth_num
    FROM Payment
) p1
INNER JOIN
(
    SELECT
        MAX(CASE WHEN CONCAT('%,', mnth, ',%') LIKE '%,12,%' THEN 12
                 WHEN CONCAT('%,', mnth, ',%') LIKE '%,11,%' THEN 11
                 WHEN CONCAT('%,', mnth, ',%') LIKE '%,10,%' THEN 10
                 WHEN CONCAT('%,', mnth, ',%') LIKE '%,9,%' THEN 9
                 WHEN CONCAT('%,', mnth, ',%') LIKE '%,8,%' THEN 8
                 WHEN CONCAT('%,', mnth, ',%') LIKE '%,7,%' THEN 7
                 WHEN CONCAT('%,', mnth, ',%') LIKE '%,6,%' THEN 6
                 WHEN CONCAT('%,', mnth, ',%') LIKE '%,5,%' THEN 5
                 WHEN CONCAT('%,', mnth, ',%') LIKE '%,4,%' THEN 4
                 WHEN CONCAT('%,', mnth, ',%') LIKE '%,3,%' THEN 3
                 WHEN CONCAT('%,', mnth, ',%') LIKE '%,2,%' THEN 2
                 WHEN CONCAT('%,', mnth, ',%') LIKE '%,1,%' THEN 1 END) AS max_mnth,
        MAX(year) AS max_year
    FROM Payment
    WHERE year = (SELECT MAX(year) FROM Payment)
) p2
    ON p1.year = p2.max_year AND
       p1.mnth_num = p2.max_mnth;

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...