如何获取每个月的MIN和MAX日期

时间:2019-09-16 21:28:33

标签: mysql sql date datetime

我在mysql中有一个数据,在我的第一个表中看起来像这样。

ID |     date_created        | cost  |  project_id
1   2019-09-01 00:00:00         10          1
2   2019-09-02 00:00:00         20          1
3   2019-09-03 00:00:00         30          1
4   2019-09-04 00:00:00         40          1
5   2019-09-05 00:00:00         50          1
6   2019-10-01 00:00:00         20          5
7   2019-10-02 00:00:00         40          5
8   2019-10-03 00:00:00         60          5
9   2019-10-04 00:00:00         70          5
10  2019-10-12 00:00:00         80          5

这是我的第二张桌子

ID |     date_created        | usage  |  project_id
1   2019-09-01 00:00:00         10          1
2   2019-09-02 00:00:00         20          1
3   2019-09-03 00:00:00         30          1
4   2019-09-04 00:00:00         40          1
5   2019-09-05 00:00:00         50          1
6   2019-10-01 00:00:00         20          5
7   2019-10-02 00:00:00         40          5
8   2019-10-03 00:00:00         60          5
9   2019-10-04 00:00:00         70          5
10  2019-10-12 00:00:00         80          5

我想要达到的结果就是这样。

ID | date_created             | cost(SUM) | total_usage (SUM)

1    2019-09-01 - 2019-09-05     150      |  150

2    2019-10-01 - 2019-10-12     260      |  260

这是我的查询。我已经可以得到成本的总和,但是当我把LEFT JOIN来获得使用的总和时,而不是只有2行。即时通讯获取错误的值并具有多行。

SELECT MONTHNAME(date_created), SUM(cost), SUM(usage)
FROM first_table as first_table
LEFT JOIN second_table as second_table ON first_table.project_id = second_table.project_id
GROUP BY MONTH(first_table.date_created), YEAR(first_table.date_created)

我需要帮助来获得成本和用法的总和。有没有办法做到这一点,或者我的方法是错误的。

2 个答案:

答案 0 :(得分:0)

您应该从不考虑月份而不考虑年份。另外,SELECT中未聚合的列应与GROUP BY中的列匹配。大多数数据库都强制执行此操作,包括最新版本的MySQL。

您的问题的答案是仅在SELECT中包括所需的其他列:

SELECT YEAR(date_created), MONTHNAME(date_created), SUM(cost), MIN(cost), MAX(cost)
FROM table_name
GROUP BY YEAR(date_created), MONTH(date_created), MONTHNAME(date_created);

答案 1 :(得分:0)

这应该返回您期望的结果。这是一个简单的汇总查询,其中按年份和月份对结果进行分组(如果您的数据跨越多年,则仅按月份分组会导致问题):

SELECT 
    CONCAT(MIN(date_created), ' - ', MAX(date_created)) date_interval, 
    SUM(cost) total_cost
FROM mytable
GROUP BY YEAR(date_created), MONTH(date_created)

Demo on DB Fiddle

| date_interval           | total_cost |
| ----------------------- | ---------- |
| 2019-09-01 - 2019-09-05 | 150        |
| 2019-10-01 - 2019-10-12 | 270        |