1

我面臨嚴峻的形勢。到目前爲止我找不到解決方案。如何將日期範圍錶轉換爲基於行的視圖?

我有一張表格給出了基於日期範圍的信息。我希望按日期分解這些信息。所以我正在尋求將範圍轉換爲行結構。

額外的困難是日期範圍中「句點」的數量是可變的。 「週期」由日期範圍和一個週期內的天數進行扣除。

更具體地,上表中的一個線我已經一個

  • ID
  • 範圍的起始日期
  • END_DATE範圍
  • 數days_in_the_period的
  • numbers_periods
  • 適用於範圍中的每個期間的價格

這裏是初始表的結構和預期的結果:

CREATE TABLE Start(
Key    VARCHAR(11) NOT NULL PRIMARY KEY 
,Start_date   VARCHAR(27) NOT NULL 
,End_Date   VARCHAR(27) NOT NULL 
,Days_in_the_period INTEGER NOT NULL 
,Nbr_periods  INTEGER NOT NULL 
,Pricing   VARCHAR(6) NOT NULL 
); 
INSERT INTO Start(Key,Start_date,End_Date,Days_in_the_period,Nbr_periods,Pricing) VALUES ('010-1280001','2000-06-01 00:00:00.0000000','2001-12-01 00:00:00.0000000',30,19,'800,87'); 
INSERT INTO Start(Key,Start_date,End_Date,Days_in_the_period,Nbr_periods,Pricing) VALUES ('010-1280001','2002-01-01 00:00:00.0000000','2005-12-01 00:00:00.0000000',30,48,'440,32'); 
INSERT INTO Start(Key,Start_date,End_Date,Days_in_the_period,Nbr_periods,Pricing) VALUES ('010-1280001','2006-01-01 00:00:00.0000000','2007-02-01 00:00:00.0000000',30,14,'282,68'); 
INSERT INTO Start(Key,Start_date,End_Date,Days_in_the_period,Nbr_periods,Pricing) VALUES ('010-1280001','2007-03-01 00:00:00.0000000','2008-03-01 00:00:00.0000000',30,13,'283,99'); 
INSERT INTO Start(Key,Start_date,End_Date,Days_in_the_period,Nbr_periods,Pricing) VALUES ('010-1280001','2008-04-01 00:00:00.0000000','2009-01-01 00:00:00.0000000',60,5,'281,81'); 
INSERT INTO Start(Key,Start_date,End_Date,Days_in_the_period,Nbr_periods,Pricing) VALUES ('010-1280001','2009-02-01 00:00:00.0000000','2009-03-01 00:00:00.0000000',30,2,'281,81'); 
INSERT INTO Start(Key,Start_date,End_Date,Days_in_the_period,Nbr_periods,Pricing) VALUES ('010-1280001','2009-04-01 00:00:00.0000000','2019-07-01 00:00:00.0000000',30,124,'281,81'); 
INSERT INTO Start(Key,Start_date,End_Date,Days_in_the_period,Nbr_periods,Pricing) VALUES ('010-1280001','2019-08-01 00:00:00.0000000','2019-08-01 00:00:00.0000000',0,1,'372,96'); 

預期

Key     Date    Pricing Days_in_the_period 

010-1280001 2000-06-01 00:00 :00.0000000 800,87 30
010-1280001 2000-07-0 1 00:00:00.0000000 800,87 30
... ... ... ...
010-1280001 2008-04-01 00:00:00.0000000 281,81 60
010-1280001 2008-06-01 00:00:00.0000000 281,81 60
... ... ... ...
010-1280001 2019年8月1日00:00:00.0000000 372,96 0

的信息,初始表包含約10萬條記錄。 有沒有人對我有一個好主意?

請恢復任何澄清, Tartino。

+1

這是一個很好的開始。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

你能解釋關於開始和結束日期如何變成單一日期的邏輯預期結果中的列? –

+0

親愛的Kannan,範圍的開始日期成爲單日期中的第一個日期。然後根據該期間的天數計算第二個單一日期。(30天將四捨五入爲一個月) 它繼續有多少次(有或沒有結束日期) – Tartino

回答

0

你可以用遞歸CTE的幫助下做到這一點:

;WITH cte AS (
    SELECT * 
    FROM YourTable 
    UNION ALL 
    SELECT c.[key], 
      DATEADD(month,c.Days_in_the_period/30,c.[Start_Date]), 
      c.End_Date, 
      c.Days_in_the_period, 
      c.Nbr_periods, 
      c.Pricing 
    FROM cte c 
    INNER JOIN YourTable y 
     ON y.[key] = c.[key] AND c.End_Date = y.End_Date 
    WHERE y.End_Date >=DATEADD(month,c.Days_in_the_period/30,c.[Start_Date]) 
) 


SELECT [key], 
     [Start_Date] as [Date], 
     Pricing, 
     Days_in_the_period 
FROM cte 
ORDER BY [key], [Start_Date] 

另一種方法是使用日曆表,並與你的表加入。

+0

感謝Gofr, 您的結構進來非常方便。 我不得不改變一些小的事情,以避免無限遞歸,但它現在工作正常。 – Tartino

+0

此代碼適用於您提供的數據樣本(我使用了兩個第一行)。如果間隔時間超過100天,請使用'OPTION(MAXRECURSION 0)' - 忘記在我的答案中提及它。 – gofr1

+0

很高興聽到這個!如果我的回答有幫助,可以自由接受/ upvote它! – gofr1