使用 Oracle 获取最近十天的销售额,即使这一天有 none
Using Oracle to fetch last ten days of sales, even if day has none
我正在尝试 select 过去 10 天的销售数据,并在没有销售的日期中包含 0。
为此,我正在尝试使用 dual 和 connect by level,但我不知道为什么日期不匹配,查询失败。
这是基本的工作查询:
SELECT
current_date - (LEVEL - 1)
,(LEVEL - 1) as result
FROM Dual CONNECT BY Level <= 10
order by result desc
结果:
Current_date-(LEVEL-1) RESULT
13-MAR-15 9
14-MAR-15 8
15-MAR-15 7
16-MAR-15 6
17-MAR-15 5
18-MAR-15 4
19-MAR-15 3
20-MAR-15 2
21-MAR-15 1
22-MAR-15 0
所以我认为这会很好,现在我有了我想要的日期,我可以尝试添加一个子查询来获取销售额(我考虑过加入但不清楚如何加入查询中的级别):
SELECT
current_date - (LEVEL - 1)
,(select count(1) from sales where for_date=(current_date - (LEVEL - 1))) as sale_volume
,(LEVEL - 1) as result
FROM Dual CONNECT BY Level <= 10
order by result desc
但是,它总是返回 0,即使在我知道有销售的日子也是如此:
Current_date-(LEVEL-1) SALE_VOLUME RESULT
13-MAR-15 0 9
14-MAR-15 0 8
15-MAR-15 0 7
16-MAR-15 0 6
17-MAR-15 0 5
18-MAR-15 0 4
19-MAR-15 0 3
20-MAR-15 0 2
21-MAR-15 0 1
22-MAR-15 0 0
SELECT
count(sales.for_Date)
FROM
(SELECT
Trunc(current_date) - (LEVEL - 1) as d
FROM
Dual CONNECT BY Level <= 10) as DateRangeTbl
LEFT JOIN
sales
ON
Sales.for_Date = DateRangeTbl.d
GROUP BY
DateRangeTbl.d
Aheho 给出的解决方案的一个补充 - 您还需要从 Sales.for_Date 列中删除时间部分,否则 ON 子句中的相等条件将不起作用。这可以通过 trunc() 或在 ON 子句中使用 to_char(your-date,date-format) 将两个日期转换为字符串来实现。我用这两种方法让它在我的数据库上工作。日期格式可以是例如 'DD-MON-YYYY'.
我正在尝试 select 过去 10 天的销售数据,并在没有销售的日期中包含 0。
为此,我正在尝试使用 dual 和 connect by level,但我不知道为什么日期不匹配,查询失败。
这是基本的工作查询:
SELECT
current_date - (LEVEL - 1)
,(LEVEL - 1) as result
FROM Dual CONNECT BY Level <= 10
order by result desc
结果:
Current_date-(LEVEL-1) RESULT
13-MAR-15 9
14-MAR-15 8
15-MAR-15 7
16-MAR-15 6
17-MAR-15 5
18-MAR-15 4
19-MAR-15 3
20-MAR-15 2
21-MAR-15 1
22-MAR-15 0
所以我认为这会很好,现在我有了我想要的日期,我可以尝试添加一个子查询来获取销售额(我考虑过加入但不清楚如何加入查询中的级别):
SELECT
current_date - (LEVEL - 1)
,(select count(1) from sales where for_date=(current_date - (LEVEL - 1))) as sale_volume
,(LEVEL - 1) as result
FROM Dual CONNECT BY Level <= 10
order by result desc
但是,它总是返回 0,即使在我知道有销售的日子也是如此:
Current_date-(LEVEL-1) SALE_VOLUME RESULT
13-MAR-15 0 9
14-MAR-15 0 8
15-MAR-15 0 7
16-MAR-15 0 6
17-MAR-15 0 5
18-MAR-15 0 4
19-MAR-15 0 3
20-MAR-15 0 2
21-MAR-15 0 1
22-MAR-15 0 0
SELECT
count(sales.for_Date)
FROM
(SELECT
Trunc(current_date) - (LEVEL - 1) as d
FROM
Dual CONNECT BY Level <= 10) as DateRangeTbl
LEFT JOIN
sales
ON
Sales.for_Date = DateRangeTbl.d
GROUP BY
DateRangeTbl.d
Aheho 给出的解决方案的一个补充 - 您还需要从 Sales.for_Date 列中删除时间部分,否则 ON 子句中的相等条件将不起作用。这可以通过 trunc() 或在 ON 子句中使用 to_char(your-date,date-format) 将两个日期转换为字符串来实现。我用这两种方法让它在我的数据库上工作。日期格式可以是例如 'DD-MON-YYYY'.