2014-01-30 16 views
0

我一直試圖獲得對我的問題anwswer,我認爲它圍繞在SQL中的遊標,但我不知道。我想我知道如何編寫循環數據的單個行,但我不知道如何運行它的所有記錄:獲取SQL來處理每一行1 1

希望有一個簡單的答案:

  1. 我有一張桌子,讓我們把它A,有Product_CodeStart_DateEnd_DateValue

  2. 我需要一個輸出表B有柱:Product_CodeMonthYearValueMonth * YearStart_DateEnd_date之間

A每個記錄應該再創建幾個記錄到B。希望這很清楚,如果不是,我很樂意詳細說明! :)

+1

是什麼讓你覺得你需要「逐行處理1行」? – FrankPl

+1

而不是字的問題,請顯示錶結構,樣本數據和所需的結果。 –

回答

0
CREATE TABLE YearMonth(
    Year int not null, 
    Month int not null, 
    FirstDay date not null, 
    LastDay date not null 
); 

用這麼多年和幾個月的時間填寫您的數據範圍(沒有問題,如果您有太多的話)。 你可以用這樣的語句來做到這一點:

WITH y(year) AS (
    SELECT 2007 
    union all 
    SELECT 2008 
    union all 
    SELECT 2009 
    union all 
    SELECT 2010 
    union all 
    SELECT 2011 
    union all 
    SELECT 2012 
    union all 
    SELECT 2013 
    union all 
    SELECT 2014 
    union all 
    SELECT 2015 
    union all 
    SELECT 2016 
), 
m(month) AS (
    SELECT 1 
    union all 
    SELECT 2 
    union all 
    SELECT 3 
    union all 
    SELECT 4 
    union all 
    SELECT 5 
    union all 
    SELECT 6 
    union all 
    SELECT 7 
    union all 
    SELECT 8 
    union all 
    SELECT 9 
    union all 
    SELECT 10 
    union all 
    SELECT 11 
    union all 
    SELECT 12 
) 
INSERT INTO YearMonth(Year, Month, FirstDay, LastDay) 
SELECT y.year 
     ,m.month 
     ,convert(date, convert(nvarchar(4), y.year) + '.' + convert(nvarchar(2), m.month) + '.01', 102) 
     ,DateAdd(day, - 1, 
       CASE WHEN m.month = 12 THEN 
        convert(date, convert(nvarchar(4), y.year + 1) + '.01.01', 102) 
        ELSE 
        convert(date, convert(nvarchar(4), y.year) + '.' + convert(nvarchar(2), m.month + 1) + '.01', 102) 
       END) 
    FROM y CROSS JOIN m 

棘手的部分來計算LastDay是這樣的:創造一個第一下一個月的日期,然後從中減去一天。這種處理該月份的最後一天都可以是28,29,30,或31

然後,只需使用該問題的加入:

INSERT INTO B(Product_Code, Month, Year, Value) 
SELECT A.Product_Code 
     ,YearMonth.Month 
     ,YearMonth.Year 
     ,A.Value 
    FROM A 
     JOIN YearMonth ON YearMonth.LastDay <= A.StartDate 
        AND YearMonth.FirstDay <= A.EndDate 

根據月*年的」確切的解釋是在Start_Date和End_date之間「,則可能必須將<=中的一個或兩個切換爲<