我有一个名为“ 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 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。
答案 0 :(得分:0)
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=9be7f2c2af8ba8ddae6a14cec807ebd2
with rentals(id, rent_id, start_date, end_date, amount) as (
SELECT 1 as id, 54 as rent_id, CAST('2019-10-12' AS DATE) as start_date, CAST('2019-10-26' AS DATE) as end_date, 100 as amount
union all
SELECT 2 as id, 54 as rent_id, CAST('2019-10-13' AS DATE) as start_date, CAST('2019-10-20' AS DATE) as end_date, 150 as amount
),
days(i) as (
select CAST('2019-10-11' as DATE)
union all
select DATEADD(d,1,i) from days where i<= '2019-10-27'
)
select
i ,
(SELECT ISNULL(SUM(amount),0) FROM rentals WHERE start_date<=i and end_date>=i) as amount
from days
临时days
的全天都是从11月ok到27 ok
MySQL解决方案(MySQL 8.0):
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=575b2c4ebe1ed9f05883e87f75f888ef
答案 1 :(得分:0)
我认为这可能会有所帮助 使用MSSQL
declare @startDate date ='11 Oct 2019'
declare @endDate date ='30 Oct 2019'
declare @rentId nvarchar(50)='54'
select d.Day,d.rent_id,isnull(d.amount,0) as amountPaid, amount = SUM(d.amount) OVER (ORDER BY d.Day) from (
select c.Day,c.id,case when rent_id is null then @rentId else rent_id end as rent_id,c.amount from (
select * from (
SELECT DATEADD(DAY,number+1,@startDate) [Day]
FROM master..spt_values
WHERE type = 'P'
AND DATEADD(DAY,number+1,@startDate) < @endDate
) a left join (select * from rentals where rent_id=@rentId) b on a.[Day] = b.start_date) c) d
答案 2 :(得分:0)
select start_date,amount,
amount+lag(amount)over(order by start_date) TOTAL
from rentals order by start_date
答案 3 :(得分:0)
此问题的常见解决方案是首先创建一个日历表。该表存储了查询需要处理的所有可能的日期。有很多解决方案可用于创建和填充表格,例如,您可以查看this SO post。
因此,我们假设一个具有以下结构和数据的表:
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
注意:您对产生的id
列的意图不清楚。您似乎愿意创建一个新的唯一ID。如果是这样,一种选择是使用ROW_NUMBER()
,如下所示:
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