两个日期之间每天未结订单的SQL计数

两个日期之间每天未结订单的SQL计数,sql,sql-server,Sql,Sql Server,我尝试过搜索,但很可能我使用了错误的关键字,因为我找不到答案 我试图找出两个日期之间的订单数量,并按员工列出。我有一个表显示员工列表,另一个表显示包含打开和关闭日期的订单列表,如果有帮助的话,还有一个日期表 联接的employee表和order表将返回如下内容: employee order ref opened closed a 123 01/01/2012 04/01/2012 b 124

我尝试过搜索,但很可能我使用了错误的关键字,因为我找不到答案

我试图找出两个日期之间的订单数量,并按员工列出。我有一个表显示员工列表,另一个表显示包含打开和关闭日期的订单列表,如果有帮助的话,还有一个日期表

联接的employee表和order表将返回如下内容:

employee    order ref   opened          closed
a           123         01/01/2012      04/01/2012
b           124         02/01/2012      03/01/2012
a           125         02/01/2012      03/01/2012
我需要将这些数据转换为:

Date            employee    Count
01/01/2012      a           1
02/01/2012      a           2
02/01/2012      b           1
03/01/2012      a           2
03/01/2012      b           1
04/01/2012      a           1
我正在从SQL server中提取数据

有什么想法吗

谢谢


Nick调用结果列计数有点奇怪,因为它实际上似乎是一个行号。 您可以使用ROW_NUMBER来实现这一点

另一个有趣的部分是,您还希望打开日期和关闭日期作为单独的行。使用简单的并集可以解决这个问题

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 

我最喜欢的方法是计算一段时间内累计打开的次数和累计关闭的次数

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
这种方法唯一的问题是,只报告有员工活动的日期。这在你的情况下有效

更一般的解决方案需要序列号来生成日期。为此,我经常从一些现有表中创建一个包含足够行的表:

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
将日期连接到员工和订单之间的连接结果,然后按日期和员工分组以获得计数,如下所示:

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

如果根本没有行,你需要它显示零吗?意外地被否决了,现在我无法撤消了。很抱歉
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
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