如何计算范围内每天的记录(包括没有记录的天数)

时间:2013-05-14 03:25:08

标签: sql oracle

我正试图稍微改进一下这个问题,因为上次我没有真正问过。我基本上是在做这个查询:

Select count(orders)
From Orders_Table
Where Order_Open_Date<=To_Date('##/##/####','MM/DD/YYYY')
and Order_Close_Date>=To_Date('##/##/####','MM/DD/YYYY')

其中## / ## / ####是同一天。本质上,此查询旨在查找任何给定日期的“未结”订单数。唯一的问题是我想要在一年或一年以上的每一天都这样做。我想如果我知道如何将## / ## / ####定义为变量,然后按该变量对计数进行分组,那么我可以让它工作但我不知道该怎么做 - 或者那里也可能是另一种方式。我目前正在SQL开发人员上使用Oracle SQL。感谢您的任何意见。

3 个答案:

答案 0 :(得分:0)

假设您有一个包含adate列的表日期列表

aDate
1/1/2012
1/2/2012
1/3/2012

现在你加入你的桌子

Select *
From Orders_Table 
join datelist on Order_Open_Date<=adate and Order_Close_Date>=adate

这会为您提供所关注的所有订单的列表,现在您可以分组并计算

Select aDate, count(*)
From Orders_Table 
join datelist on Order_Open_Date<=adate and Order_Close_Date>=adate
group by adate

如果要传递参数,则只需使用递归cte

生成日期
with datelist as
(
   select @startdate as adate
   UNION ALL
   select adate + 1
   from datelist
   where (adate + 1) <= @lastdate
)
Select aDate, count(*)
From Orders_Table 
join datelist on Order_Open_Date<=adate and Order_Close_Date>=adate
group by adate

注意:我没有要测试的Oracle数据库,所以我可能在这个平台上有一些语法错误,但你明白了。

注意2:如果您希望列出0的所有日期用于没有任何用途的日期作为您的选择语句:

Select aDate, count(Order_Open_Date)
From Orders_Table 
left join datelist on Order_Open_Date<=adate and Order_Close_Date>=adate
group by adate

答案 1 :(得分:0)

你可以使用像这样的“行生成器”技术(为Hogan的评论编辑)

Select RG.Day,
       count(orders)
From   Orders_Table,
      (SELECT trunc(SYSDATE) - ROWNUM as Day
       FROM  (SELECT 1 dummy FROM dual)
       CONNECT BY LEVEL <= 365
      ) RG
Where RG.Day              <=To_Date('##/##/####','MM/DD/YYYY')
  and RG.Day              >=To_Date('##/##/####','MM/DD/YYYY')
  and Order_Open_Date(+)  <= RG.Day
  and Order_Close_Date(+) >= RG.Day - 1
Group by RG.Day
Order by RG.Day

这应该列出上一年的每一天以及相应的订单数量

答案 2 :(得分:-1)

如果您只想要一天,则可以使用TRUNC这样查询

select count(orders)
From orders_table
where trunc(order_open_date) = to_date('14/05/2012','dd/mm/yyyy')