繁体   English   中英

在MySQL中获取每月总费用

[英]get total amount of expenses per month in MySQL

我目前正在处理2张桌子,费用和收入。 为了使结构简单并可以看到它,这是小提琴: http ://sqlfiddle.com/#!9/ 256cd64/2

我需要从查询中获得的结果是本年度每个月的总金额,并尝试了以下操作:

select sum(e.amount) as expense, DATE_FORMAT(e.date,'%m') as month 
from expenses e
where year(e.date) = 2019
group by month

我的问题是,只要他们没有返回0,那么我只需要花几个月的时间进行注册,就算他们没有注册也要花12个月。

目前,我正在处理费用表,但我想使用一个查询来返回每月费用和收入,这是我希望获得的最终输出的一个示例:

|   Month | Expense| Incomes |
|---------|--------|---------|
|       01|      0 |       0 |
|       02|   3000 |    4000 |
|       03|   1500 |    5430 |
|       04|  2430  |    2000 |
|       05|  2430  |    1000 |
|       06|  2430  |    1340 |
|       07|     0  |    5500 |
|       08|  2430  |    2000 |
|       09|  1230  |    2000 |
|       10|  8730  |    2000 |
|       11|  2430  |    2000 |
|       12|  6540  |    2000 |

您需要生成月份值,然后使用left join匹配费用:

select coalesce(sum(e.amount), 0) as expense, m.month
from (select '01' as month union all
      select '02' as month union all
      select '03' as month union all
      select '04' as month union all
      select '05' as month union all
      select '06' as month union all
      select '07' as month union all
      select '08' as month union all
      select '09' as month union all
      select '10' as month union all
      select '11' as month union all
      select '12' as month
     ) m left join
     expenses e
     on year(e.date) = 2019 and
        DATE_FORMAT(e.date,'%m') = m.month
group by m.month;

是db <>小提琴。

至于income ,您应该问另一个问题。

您可以使用MONTH从日期列中获取月份值,然后使用GROUP BY来获取所需的输出,如下所示:

SELECT SUM(e.amount) AS expense, 
MONTH(e.date) AS month    
FROM expenses e
WHERE YEAR(e.date) = 2019
GROUP BY MONTH(e.date)

尝试将COALESCE(sum(e.amount),0) as expense更改sum(e.amount) as expenseCOALESCE(sum(e.amount),0) as expense

COALESCE函数返回第一个非NULL值。

SELECT
    t1.month,
    COALESCE(t2.amount, 0) AS expenses,
    COALESCE(t3.amount, 0) AS incomes
FROM
(
    SELECT 1 AS month UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 4 UNION ALL
    SELECT 5 UNION ALL
    SELECT 6 UNION ALL
    SELECT 7 UNION ALL
    SELECT 8 UNION ALL
    SELECT 9 UNION ALL
    SELECT 10 UNION ALL
    SELECT 11 UNION ALL
    SELECT 12
) t1
LEFT JOIN
(
    SELECT MONTH(date) AS month, SUM(amount) AS amount
    FROM expenses
    GROUP BY MONTH(date)
) t2
    ON t1.month = t2.month
LEFT JOIN
(
    SELECT MONTH(date) AS month, SUM(amount) AS amount
    FROM incomes
    GROUP BY MONTH(date)
) t3
    ON t1.month = t3.month
ORDER BY
    t1.month;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM