所以我在SQL SERVER 2008中有一个表有一个itmes列表。一个人每天最多只能订购4件商品。所以我想知道在任何开始日期或结束日期是否有一个时间,他们有超过4项目的特定日期。
以下是我的表格示例:
OrderNo Item quantity StartDate EndDate
112 xbox 2 2012-12-05 2012-12-10
123 tv 1 2012-12-06 2012-12-07
125 computer 4 2012-12-10 2012-12-11
165 game 1 2012-12-06 2012-12-10
186 toy 2 2012-12-02 2012-12-04
所以从这张桌子我们可以看到他们每天有超过4件物品......现在我需要知道他们有多少物品以及他们有多于4件物品的天数。
基本上我想检查项目何时退出和返回时间的重叠日期,以查看特定日期是否同时有超过4个项目。
我不知道如何处理这个问题。我在SQL中查看了许多重叠的日期和范围。
答案 0 :(得分:1)
您需要一张日历表。理想情况下,这是在master数据库中设置的永久性表,所有表格都已正确编入索引,但您可以动态创建它,如:
WITH Calendar
AS
(
SELECT MIN(StartDate) AS Today
,MAX(EndDate) AS LastDay
FROM table
UNION ALL
SELECT DATEADD(day,1,Today)
,LastDay
FROM Calendar
WHERE Today<LastDay
)
注意:您的正常最大递归为100,因此除非您添加OPTION (MAXRECURSION n)
,其中n是小于32768的int,否则您可以获得的最大值为100天。
您现在有一张表可以加入原始表格,涵盖所有相关日期,如此
SELECT Today
,SUM(Quantity) AS ItemCount
FROM Calendar c
INNER JOIN
Table t ON c.Today BETWEEN t.StartDate AND t.EndDate
GROUP BY Today
HAVING SUM(Quantity)>4
请参阅此SQL Fiddle
此SQL fiddle为解决方案提供了“永久性”日历表。
答案 1 :(得分:0)
这个使用运行总计来汇总每个日期订购的项目。要检查任何日期(未在示例数据中给出),只需使用此结果并进行一些连接。有关序号/日期的更多信息,请查看islands and gaps
insert into "timestamps"
select
*
from
(
select "OrderNo", "ts", "quantity", case when "timestamp" = 'StartDate' then 1 else -1 end as "factor", 0 as "rolSum" from
( select "OrderNo", "StartDate", "EndDate", "quantity" from "data" ) as d
unpivot ( "ts" for "timestamp" in ( "StartDate", "EndDate" )) as pvt
) as data
order by "ts"
declare @rolSum int = 0
update "timestamps" set @rolSum = "rolSum" = @rolSum + "quantity" * "factor" from "timestamps"
select
"OrderNo"
, "ts"
, "rolSum"
from
"timestamps"
请参阅SQL-Fiddle-Demo(包括创建表格和演示数据)。