1

所以我在 SQL SERVER 2008 中有一个表,其中包含一个项目列表。一个人每天最多只能订购 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 中许多重叠的日期和范围。

4

2 回答 2

1

你需要一个日历表。理想情况下,这是在您的主数据库中设置的永久表,所有索引都已正确索引,但您可以像这样动态创建它:

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,因此您最多可以获得 100 天,除非您添加OPTION (MAXRECURSION n)其中 n 是小于 32768 的 int。

您现在有一个表格,您可以将其与涵盖所有相关日期的原始表格连接起来,就像这样

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为解决方案提供了一个“永久”日历表。

于 2013-01-19T00:01:23.063 回答
0

这个使用运行总计来汇总每个日期订购的项目。要检查任何日期(示例数据中未给出),只需使用此结果并进行一些连接。有关序列号/日期的更多信息,请查看孤岛和间隙

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(包括表创建和您的演示数据)。

于 2013-01-19T00:20:34.140 回答