我有一个表格,其中包含不同报告日期的全球销售数据,如下所示:
event_id | date | sales_on_date
-----------+---------------+----------
1 | 2015-01-01 | 1000
1 | 2015-02-01 | 1500
1 | 2015-03-01 | 1600
2 | 2015-01-01 | 200
2 | 2015-02-01 | 500
3 | 2015-01-01 | 100
我需要编写一个SELECT语句来输出每个日期的销售额(或最后的已知销售额),如下所示:
event_id | date | sales_on_date
-----------+---------------+----------
1 | 2015-01-01 | 1000
1 | 2015-02-01 | 1500
1 | 2015-03-01 | 1600
2 | 2015-01-01 | 200
2 | 2015-02-01 | 500
2 | 2015-03-01 | 500
3 | 2015-01-01 | 100
3 | 2015-02-01 | 100
3 | 2015-03-01 | 100
目前,我必须发出一个SQL请求来从我的表中获取所有数据,然后使用PHP例程填补空白,但它似乎是纯粹的' SQL解决方案将更加方便和优雅。
知道如何在SQL中执行此操作吗?
答案 0 :(得分:1)
这有点复杂,因为查询有两个部分。第一个是生成所有行。第二个是填写它们。第一个是CROSS JOIN
。第二个是相关的子查询:
select e.event_id, d.date,
(select t.sales_on_date
from t
where t.event_id = e.event_id and t.date <= d.date
order by t.date desc
limit 1
) as sales_on_date
from (select distinct event_id from t) e cross join
(select distinct date from t) d
order by e.event_id, d.date;