Mysql SQL每个日期的总金额
我有一个名为rentals的表,其中存储的数据如下:Mysql SQL每个日期的总金额,mysql,date,sum,Mysql,Date,Sum,我有一个名为rentals的表,其中存储的数据如下: id | rent_id | start_date | end_date | amount --------------------------------------------- 1 | 54 | 12-10-2019 | 26-10-2019| 100 2 | 54 | 13-10-2019 | 20-10-2019| 150 我期待什么?结果如下: 12-10-2019 , amount 100 from
id | rent_id | start_date | end_date | amount
---------------------------------------------
1 | 54 | 12-10-2019 | 26-10-2019| 100
2 | 54 | 13-10-2019 | 20-10-2019| 150
我期待什么?结果如下:
12-10-2019 , amount 100
from 13-10-2019 to 20-10-2019, amount 250
from 21-10-2019 to 26-10-2019, amount 100
基本上,我想要,每天的总金额。但我还想计算两人之间的天数
因此,预期结果将是:
id | rent_id | day | amount
---------------------------------------------
1 | 54 | 12-10-2019 | 100
2 | 54 | 13-10-2019 | 250
3 | 54 | 14-10-2019 | 250
等等
我实际上正在运行以下sql:
select start_date, ( select sum(amount) from rentals as t2 where t2.start_date <= t1.start_date) as amount from rentals as t1 WHERE rent_id = 54 group by start_date
但结果与预期不符
我正在使用MySQL
临时工作日是指从11日到27日的所有工作日
MySQL解决方案MySQL 8.0:
我想这可能会有帮助
使用MSSQL
这个问题的一个常见解决方案是首先创建一个日历表。这是一个存储查询需要处理的所有可能日期的表。在野外有一些解决方案可用于创建和填充表格,例如,您可以查看 因此,让我们假设一个具有以下结构和数据的表:
CREATE TABLE all_dates as (my_date DATE PRIMARY KEY);
INSERT INTO all_dates VALUES
('12-10-2019'),
('13-10-2019'),
('14-10-2019'),
...
;
现在,只需将表与日历表合并并汇总结果即可解决问题,如下所示:
SELECT r.rent_id, d.my_date `day`, SUM(amount) amount
FROM all_dates d
INNER JOIN rentals r ON d.my_date BETWEEN r.start_date AND r.end_date
GROUP BY r.rent_id, d.my_date
SELECT ROW_NUMBER() OVER(ORDER BY rent_id, `day`) id, x.*
FROM (
SELECT r.rent_id, d.my_date `day`, SUM(amount) amount
FROM all_dates d
INNER JOIN rentals r ON d.my_date BETWEEN r.start_date AND r.end_date
GROUP BY r.rent_id, d.my_date
) x
注意:您对结果id列的意图不清楚。您似乎愿意创建一个新的唯一id。如果愿意,一个选项是使用ROW_NUMBER,如下所示:
SELECT r.rent_id, d.my_date `day`, SUM(amount) amount
FROM all_dates d
INNER JOIN rentals r ON d.my_date BETWEEN r.start_date AND r.end_date
GROUP BY r.rent_id, d.my_date
SELECT ROW_NUMBER() OVER(ORDER BY rent_id, `day`) id, x.*
FROM (
SELECT r.rent_id, d.my_date `day`, SUM(amount) amount
FROM all_dates d
INNER JOIN rentals r ON d.my_date BETWEEN r.start_date AND r.end_date
GROUP BY r.rent_id, d.my_date
) x
我应该提到我运行MySQL,这是不兼容的…而且我不需要额外的时间使用0 amountAbove确实是MS-SQL的解决方案。MySQL的哪个版本,因为8+与如果我在db fiddle中选择MySQL有关,它会在调用本机函数“ISNULL”时抛出错误参数计数,而且我看到您手动选择1作为id,2作为id,但它可能有更多的ID…第1Ok行“declare@startDate date='2019年10月11日'declare@endDate='2019年10月30日'decl'附近的语法错误我需要提到的是我在使用MSSQL
SELECT ROW_NUMBER() OVER(ORDER BY rent_id, `day`) id, x.*
FROM (
SELECT r.rent_id, d.my_date `day`, SUM(amount) amount
FROM all_dates d
INNER JOIN rentals r ON d.my_date BETWEEN r.start_date AND r.end_date
GROUP BY r.rent_id, d.my_date
) x