0

Microsoft SQL Serverには、レコードID、開始日、終了日、および数量のテーブルが存在します。

アイデアは、各レコードについて、範囲内の数量/合計日数=1日あたりの数量です。

可能なすべての日付を含むテーブルが存在する場合、SQL Serverで次の例のような結果セットを生成するにはどうすればよいですか?

元:

RecordID | Start Date | End Date  | Quantity
1        |  1/1/2010  | 1/5/2010  | 30000
2        |  1/3/2010  | 1/9/2010  | 20000
3        |  1/1/2010  | 1/7/2010  | 10000

Results as
1        | 1/1/2010 |  QTY (I can do the math easy, just need the dates view)
1        | 1/2/2010 | 
1        | 1/3/2010 | 
1        | 1/4/2010 | 
1        | 1/3/2010 | 
2        | 1/4/2010 | 
2        | 1/5/2010 | 
2        | 1/6/2010 | 
2        | 1/7/2010 | 
2        | 1/8/2010 | 
2        | 1/9/2010 | 
3        | 1/1/2010 | 
3        | 1/2/2010 | 
3        | 1/3/2010 | 
3        | 1/4/2010 | 
3        | 1/5/2010 | 
3        | 1/6/2010 | 
3        | 1/7/2010 | 

取得できる日付でグループ化すると、その日の数量の合計を取得できますが、将来これらのレコードの一部を除外する可能性のあるユーザー提供のフィルターのため、最終的な結果セットを集計できません。

編集

明確にするために、これは単なるサンプルです。結果のレコードIDに関連する詳細を取得するためにサイドに参加できるため、フィルターは関係ありません。

実際のデータには毎週増加するN個のレコードが含まれており、日付が同じになることはありません。開始日と終了日が異なる2000のレコードが存在する可能性があります...それがビューを生成したいものです。データに直接参加して、必要な残りの作業を行うことができます

また、これは過去、現在、未来のデータに関するものです。一時的な日付の表を削除したいと思います。再帰クエリを使用して50年以内に存在するすべての日付を取得していましたが、これはビューのMAXRECURSION制限を超えており、使用できません。

4

2 に答える 2

3

答え

select RecordId,d.[Date], Qty/ COUNT(*) OVER (PARTITION BY RecordId) AS Qty
from EX join Dates d on d.Date between [Start Date] and [End Date]
ORDER BY RecordId,[Date]

注意: 以下のデモ CTE は、dateSQL Server 2008 のデータ型を使用していますが、一般的なアプローチは SQL2005 でも機能するはずです。

テストケース

/*CTEs for testing purposes only*/

WITH EX AS
(
    SELECT 1 AS RecordId, 
    cast('1/1/2010' as date) as [Start Date], 
    cast('1/5/2010' as date) as  [End Date], 
    30000 AS Qty
union all
    SELECT 2 AS RecordId, 
    cast('1/3/2010' as date) as [Start Date], 
    cast('1/9/2010' as date) as  [End Date], 
    20000  AS Qty
),Dates AS /*Dates Table now adjusted to do greater range*/
(

SELECT  DATEADD(day,s1.number + 2048*s2.number,'1990-01-01') AS [Date] 
FROM master.dbo.spt_values s1 CROSS JOIN master.dbo.spt_values s2
where s1.type='P' AND s2.type='P' and s2.number <= 8
order by  [Date] 
)


select RecordId,d.[Date], Qty/ COUNT(*) OVER (PARTITION BY RecordId) AS Qty
from EX join Dates d on d.Date between [Start Date] and [End Date]
ORDER BY RecordId,[Date]

結果

RecordId    Date       Qty
----------- ---------- -----------
1           2010-01-01 6000
1           2010-01-02 6000
1           2010-01-03 6000
1           2010-01-04 6000
1           2010-01-05 6000
2           2010-01-03 2857
2           2010-01-04 2857
2           2010-01-05 2857
2           2010-01-06 2857
2           2010-01-07 2857
2           2010-01-08 2857
2           2010-01-09 2857
于 2010-07-20T22:11:19.777 に答える
1

これを試すことができると思います。

SELECT [Quantities].[RecordID], [Dates].[Date], SUM([Quantity])
FROM [Dates]
JOIN [Quantities] on [Dates].[Date] between [Quantities].[Start Date] and [End Date]
GROUP BY [Quantities].[RecordID], [Dates].[Date]
ORDER BY [Quantities].[RecordID], [Dates].[Date]
于 2010-07-20T21:47:56.090 に答える