简体   繁体   中英

How to count records for each day in a range (including days without records)

I'm trying to refine this question a little since I didn't really ask correctly last time. I am essentially doing this query:

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

Where ##/##/#### is the same day. In essence this query is designed to find the number of 'open' orders on any given day. The only problem is I'm wanting to do this for each day of a year or more. I think if I knew how to define the ##/##/#### as a variable and then grouped the count by that variable then I could get this to work but I'm not sure how to do that-or there may be another way as well. I am currently using Oracle SQL on SQL developer. Thanks for any input.

Lets say you had a table datelist with a column adate

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

Now you join that to your table

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

This gives you a list of all the orders you care about, now you group by and count

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

If you want to pass in a parameters then just generate the dates with a recursive 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

NOTE: I don't have an Oracle DB to test on so I might have some syntax wrong for this platform, but you get the idea.

NOTE2: If you want all dates listed with 0 for those that have nothing use this as your select statement:

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

You could use a "row generator" technique like this (edited for Hogan's comments) :

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

This should list each day of the previous year with the corresponding number of orders

If you want only one day you can query using TRUNC like this

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM