Sql server 根据UDF结果更新表
我有一张桌子Sql server 根据UDF结果更新表,sql-server,tsql,Sql Server,Tsql,我有一张桌子@ROOMS\u由DEPA\u 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),
@ROOMS\u由DEPA\u 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)
因此,在填充一些数据表后,如下所示:
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)
我必须使用此表中的结果更新每行列WEEK\u 1
,WEEK\u 2
,WEEK\u 3
,WEEK\u 4
,WEEK\u 5
,WEEK\u 6
,该表由OPRO\u KEY
和KAPACITETA
生成:
DECLARE @WEEKS_MONTH AS DBO.WEEKS_MONTH_Type
(
WEEKOFMONTH INT,
WEEKSTART DATE,
WEEKEND DATE,
NO_DAYS INT,
AVERAGE_AVAI DECIMAL(8,2)
)
(它是表类型,因为它被用作函数参数)。该表的结果如下所示:
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)
要获得第二个表,我有一个自定义项:
dbo.f_SCAVAI_GetWeekAverage(@iOPRO_KEY, @WEEKS_MONTH, '1', @iKAPACITETA)
表@WEEKS\u MONTH
中填充了一些值(weekofmonth、datestart、dateend、no\u days),并且每个调用都保持不变:
我的问题是如何为每个OPRO\u键调用此函数,以及如何从返回的表中更新周列?
列将根据WEEKOFMONTH
进行更新。示例:WEEK\u 1
updatewhere@WEEK\u MONTHS.WEEK\u OF\u MONTH
=1,WEEK\u 2
where@WEEK\u MONTHS
=2如果您总是有整整6周的时间,那么按DEPA\u键1更新@ROOMS\u表的最简单方法是使用@weeks\u 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
我通过以下方法解决了这个问题:
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
请以文本而不是图像的形式编写数据测试。。。或者最好直接插入:这样更容易帮助您。感谢您指出这一点,我已经更正了我的问题。PIVOT
听起来像您要找的。