两个日期之间每天未结订单的SQL计数
我尝试过搜索,但很可能我使用了错误的关键字,因为我找不到答案 我试图找出两个日期之间的订单数量,并按员工列出。我有一个表显示员工列表,另一个表显示包含打开和关闭日期的订单列表,如果有帮助的话,还有一个日期表 联接的employee表和order表将返回如下内容:两个日期之间每天未结订单的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 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