在MySQL中获取每月的费用总额

在MySQL中获取每月的费用总额,mysql,sql,database,Mysql,Sql,Database,我目前正在处理两个表,费用和收入。为了保持结构简单并能看到它,这是小提琴: 我需要查询的结果是本年度每个月的总金额,为此,我尝试了以下方法: 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个月 目

我目前正在处理两个表,费用和收入。为了保持结构简单并能看到它,这是小提琴:

我需要查询的结果是本年度每个月的总金额,为此,我尝试了以下方法:

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 |

您可以使用MONTH从日期列中获取月份值,然后按它们分组以获得所需的输出,如下所示-

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

您需要生成月份值,然后使用
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;
他是一把小提琴


至于
收入
,你应该问另一个问题。

尝试将你的
金额(e.amount)作为费用
更改为:
合并(金额(e.amount),0)作为费用


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

在进行查看时,查询按预期工作,但是我有很多记录;它花费的时间太长,因为它贯穿整个表。我试图为日期列创建一个索引,并尝试更改此部分:
year(e.date)=2019
,但我仍然有相同的问题,因此我想知道如何优化它?我对这个话题了解不多,请你给我指点一下,至少告诉我去哪里好吗start@FeRcHo . . . 你应该问一个关于性能的新问题。原始查询使用
where
子句中的
date()
函数,这将排除索引的使用。目前尚不清楚索引是否真的有帮助。您需要提供更多信息,例如表的大小、键等。谢谢,您是对的。我将尝试发布一个关于性能的问题,根据您的回答,我目前在这里提出的查询,希望您也能帮助我谢谢!此查询不会搜索当前年份,我只想输入2019年的费用和收入,例如'year(t2.date)=2019年和year(t3.date)=2019'希望您的问题能够解决。
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;