2017-03-16 55 views
0

我有一個表@ROOMS_BY_DEPA_KEY1這樣的:更新結果見表

DECLARE @ROOMS_BY_DEPA_KEY1 TABLE 
(    
    OPRO_KEY INT,    
    KAPACITETA INT,    
    WEEK_1 DECIMAL(8,2), 
    WEEK_2 DECIMAL(8,2), 
    WEEK_3 DECIMAL(8,2), 
    WEEK_4 DECIMAL(8,2), 
    WEEK_5 DECIMAL(8,2), 
    WEEK_6 DECIMAL(8,2) 
) 

INSERT INTO @ROOMS_BY_DEPA_KEY1(OPRO_KEY) 
VALUES (160000014),(160000015),(160000016),(160000017),(160000018),(160000019),(160000020) 

所以填充一些數據表後看起來是這樣的:

enter image description here

我必須更新每個列列WEEK_1WEEK_2,WEEK_3, WEEK_4, WEEK_5,WEEK_6與來自該表的結果,其從生成3210和KAPACITETA

DECLARE @WEEKS_MONTH AS DBO.WEEKS_MONTH_Type 
(
    WEEKOFMONTH INT, 
    WEEKSTART DATE, 
    WEEKEND DATE, 
    NO_DAYS INT, 
    AVERAGE_AVAI DECIMAL(8,2) 
) 

(它的表型,因爲它被用作功能參數)。從表中的結果是這樣的:

enter image description here

爲了得到這個第二個表我有一個UDF:

dbo.f_SCAVAI_GetWeekAverage(@iOPRO_KEY, @WEEKS_MONTH, '1', @iKAPACITETA) 

@WEEKS_MONTH充滿了一些值(weekofmonth,datestart,dateend,no_days)和它保持不變爲每個呼叫:

enter image description here

我的問題是如何爲每個OPRO_KEY調用此函數以及如何從返回表更新周列? 列根據WEEKOFMONTH進行更新。例如:WEEK_1更新,其中@WEEK_MONTHS.WEEK_OF_MONTH = 1,WEEK_2其中@WEEK_MONTHS = 2

+3

請把你的數據測試的文本,而不是圖像...或者更好directlyas INSERT INTO:以這種方式更容易幫助你。 – etsa

+0

感謝您指出這一點,我已經糾正了我的問題。 – FrenkyB

+0

'PIVOT'聽起來像你在找什麼。 – shawnt00

回答

1

如果你將永遠有完全相同6周,以更新@ ROOMS_BY_DEPA_KEY1表的簡單的方法是使用@Weeks_Month表的支點:

UPDATE @ROOMS_BY_DEPA_KEY1 
SET Week_1 = w.Week_1 
    ,Week_2 = w.Week_2 
    ,Week_3 = w.Week_3 
    ,Week_4 = w.Week_4 
    ,Week_5 = w.Week_5 
    ,Week_6 = w.Week_6 
FROM 
    (SELECT * 
    FROM (SELECT 'Week_' + CAST(WeekOfMonth AS VARCHAR) AS WeekName 
      ,Average_Avai 
     FROM @WEEKS_MONTH) wm 
    PIVOT (MAX(Average_Avai) 
      FOR WeekName IN (Week_1, Week_2, Week_3, Week_4, Week_5, Week_6) 
     )p 
    ) w 
0

我已經成功地解決了這個問題:

UPDATE RM 
       SET RM.WEEK_1 = (
        SELECT P.AVERAGE_AVAI FROM dbo.f_SCAVAI_GetWeekAverage(RM.DEPA_KEY, RM.OPRO_KEY, @WEEKS_MONTH, @cWorkDaysOnly, RM.KAPACITETA) P WHERE P.WEEKOFMONTH = 1 
       ), 
       RM.WEEK_2 = (
        SELECT P.AVERAGE_AVAI FROM dbo.f_SCAVAI_GetWeekAverage(RM.DEPA_KEY,RM.OPRO_KEY, @WEEKS_MONTH, @cWorkDaysOnly, RM.KAPACITETA) P WHERE P.WEEKOFMONTH = 2 
       ), 
       RM.WEEK_3 = (
        SELECT P.AVERAGE_AVAI FROM dbo.f_SCAVAI_GetWeekAverage(RM.DEPA_KEY,RM.OPRO_KEY, @WEEKS_MONTH, @cWorkDaysOnly, RM.KAPACITETA) P WHERE P.WEEKOFMONTH = 3 
       ), 
       RM.WEEK_4 = (
        SELECT P.AVERAGE_AVAI FROM dbo.f_SCAVAI_GetWeekAverage(RM.DEPA_KEY,RM.OPRO_KEY, @WEEKS_MONTH, @cWorkDaysOnly, RM.KAPACITETA) P WHERE P.WEEKOFMONTH = 4 
       ), 
       RM.WEEK_5 = (
        SELECT P.AVERAGE_AVAI FROM dbo.f_SCAVAI_GetWeekAverage(RM.DEPA_KEY,RM.OPRO_KEY, @WEEKS_MONTH, @cWorkDaysOnly, RM.KAPACITETA) P WHERE P.WEEKOFMONTH = 5 
       ), 
       RM.WEEK_6 = (
        SELECT P.AVERAGE_AVAI FROM dbo.f_SCAVAI_GetWeekAverage(RM.DEPA_KEY,RM.OPRO_KEY, @WEEKS_MONTH, @cWorkDaysOnly, RM.KAPACITETA) P WHERE P.WEEKOFMONTH = 6 
       ) 
       FROM @ROOMS_BY_DEPA_KEY1 RM