1

だから私はアイテムのリストを持つSQL SERVER 2008にテーブルを持っています。お一人様1日最大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

したがって、この表から、1 日に 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 であるため、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フィドルを参照してください

このSQL フィドルは、「永続的な」カレンダー テーブルを使用したソリューションを提供します。

于 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 に答える