SQL Count Of Open Orders Each Day Between Two Dates

后端 未结 4 1067
感情败类
感情败类 2020-12-21 04:38

I\'ve tried searching but it\'s likely I\'m using the wrong keywords as I can\'t find an answer.

I\'m trying to find the number of orders that are open between two d

相关标签:
4条回答
  • 2020-12-21 04:59
    SELECT opened,employee,count(*)
    FROM employee LEFT JOIN orders
    WHERE opened < firstDate and opened > secondDate
    GROUP BY opened,employee
    

    or you can change the first condition in

    WHERE opened BETWEEN firstDate and secondDate
    
    0 讨论(0)
  • 2020-12-21 05:03

    Calling the result column count was a bit odd because it seems to be in fact a row number. You can do that by using ROW_NUMBER.

    The other interesting part is that you also want open date and close date as separate rows. Using a simple UNION will solve that.

    WITH cte 
         AS (SELECT Row_number() OVER ( PARTITION BY employee  
                                        ORDER BY order_ref) count, 
                    employee, 
                    opened, 
                    closed 
             FROM   orders) 
    SELECT employee,  opened date,  count 
    FROM   cte 
    UNION ALL 
    SELECT employee,  closed date,  count 
    FROM   cte 
    ORDER  BY Date, 
              employee 
    

    DEMO

    0 讨论(0)
  • 2020-12-21 05:07

    Join Dates to the result of the join between Employees and Orders, then group by dates and employees to obtain the counts, something like this:

    SELECT
      d.Date,
      o.Employee,
      COUNT(*) AS count
    FROM Employees e
      INNER JOIN Orders o ON e.ID = o.Employee
      INNER JOIN Dates d ON d.Date BETWEEN o.Opened AND o.Closed
    GROUP BY
      d.Date,
      o.Employee
    
    0 讨论(0)
  • 2020-12-21 05:08

    My favorite way to do this counts the number of cumulative opens and the number of cumulative closes over time.

    with cumopens as
        (select employee, opened as thedate,
                row_number() over (partition by employee order by opened) as cumopens,
                0 as cumcloses
         from eo
        ),
         cumcloses as
        (select employee, closed as thedate, 0 as cumopens,
                row_number() over (partition by employee order by closed ) as cumcloses
         from eo
        )
    select employee, c.thedate, max(cumopens), max(cumcloses),
           max(cumopens) - max(cumcloses) as stillopened
    from ((select *
           from cumopens
          ) union all
          (select *
           from cumcloses
          )
         ) c
    group by employee, thedate
    

    The only problem with this approach is that only dates where there is employee activity get reported. This works in your case.

    The more general solution requires a sequence numbers to generate dates. For this, I often create one from some existing table with enough rows:

    with nums as
        (select row_number() over (partition by null order by null) as seqnum
         from employees
        )
    select employee, dateadd(day, opened, seqnum) as thedate, count(*)
    from eo join
         nums
         on datediff(day, opened, closed) < seqnum
    group by employee, dateadd(day, opened, seqnum)
    order by 1, 2
    
    0 讨论(0)
提交回复
热议问题