【问题标题】:Getting last paid month for users using mysql stored procedure使用 mysql 存储过程为用户获取最后一个月的报酬
【发布时间】:2019-10-15 09:54:52
【问题描述】:

我有如下付款条目表

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

我想从第一个表中获得最后支付的月份和年份。如何做到这一点

【问题讨论】:

标签: mysql stored-procedures


【解决方案1】:

您将 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;

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    相关资源
    最近更新 更多