把表TAB1内容更新到TAB2
F1 F2 ...F31 代表一个月中的每一天。
比如这个表中的数据是2006年01月数据TAB1:
ID F1 F2 F2 F3 ..... F31
001 NULL 10 NULL 15 ..... NULL TAB2:
ID DATE VAL
001 2006-01-01
001 2006-01-02 10
。。
001 2006-01-31 注:当TAB1中 F1,F2....F31为NULL时,不更新TAB2中的VAL
F1 F2 ...F31 代表一个月中的每一天。
比如这个表中的数据是2006年01月数据TAB1:
ID F1 F2 F2 F3 ..... F31
001 NULL 10 NULL 15 ..... NULL TAB2:
ID DATE VAL
001 2006-01-01
001 2006-01-02 10
。。
001 2006-01-31 注:当TAB1中 F1,F2....F31为NULL时,不更新TAB2中的VAL
这里有个例子,参考一下
CREATE TABLE TAB1(ID varchar(10),
F1 int, F2 int, F3 int, F4 int,
--......... 其他字段
F31 int)
INSERT TAB1 SELECT '001',
NULL, 10, NULL, 15,
--..........其他列的值
NULLCREATE TABLE TAB2(ID varchar(10), DATE datetime, VAL int)
INSERT TAB2 SELECT '001', '2006-01-01', NULL
UNION ALL SELECT '001', '2006-01-02', 10
UNION ALL SELECT '001', '2006-01-03', 10
UNION ALL SELECT '001', '2006-01-04', 10
--..........其他日期
UNION ALL SELECT '001', '2006-01-31', NULL
GO--更新处理
UPDATE B
SET VAL = A.VAL
FROM TAB2 B
INNER JOIN(
SELECT
ID,
DATE=DATEADD(Day, CAST(STUFF(DATE, 1, 1, '') as int), '2005-12-31'),
VAL
FROM TAB1
UNPIVOT(
VAL FOR DATE IN(F1, F2, F3, F4,
-- ..... 其他字段
F31)
)UP
)A
ON A.DATE = B.DATE-- 显示结果
SELECT * FROM TAB2
GO
DROP TABLE TAB1, TAB2
---------- ----------------------- -----------
001 2006-01-01 00:00:00.000 NULL
001 2006-01-02 00:00:00.000 10
001 2006-01-03 00:00:00.000 10
001 2006-01-04 00:00:00.000 15
001 2006-01-31 00:00:00.000 NULL(5 行受影响)
CREATE TABLE TAB1(ID varchar(10),
F1 int, F2 int, F3 int, F4 int,
--......... 其他字段
F31 int)
INSERT TAB1 SELECT '001',
NULL, 10, NULL, 15,
--..........其他列的值
NULLCREATE TABLE TAB2(ID varchar(10), DATE datetime, VAL int)
INSERT TAB2 SELECT '001', '2006-01-01', NULL
UNION ALL SELECT '001', '2006-01-02', 10
UNION ALL SELECT '001', '2006-01-03', 10
UNION ALL SELECT '001', '2006-01-04', 10
--..........其他日期
UNION ALL SELECT '001', '2006-01-31', NULL
GO--更新处理
UPDATE B
SET VAL = A.VAL
FROM TAB2 B
INNER JOIN(
SELECT ID, VAL = F1,
DATE = DATEADD(Day, CAST(STUFF(F1, 1, 1, '') as int), '2005-12-31')
FROM TAB1 WHERE F1 IS NOT NULL
UNION ALL
SELECT ID, VAL = F2,
DATE = DATEADD(Day, CAST(STUFF(F2, 1, 1, '') as int), '2005-12-31')
FROM TAB1 WHERE F2 IS NOT NULL
UNION ALL
SELECT ID, VAL = F3,
DATE = DATEADD(Day, CAST(STUFF(F3, 1, 1, '') as int), '2005-12-31')
FROM TAB1 WHERE F3 IS NOT NULL
UNION ALL
SELECT ID, VAL = F4,
DATE = DATEADD(Day, CAST(STUFF(F4, 1, 1, '') as int), '2005-12-31')
FROM TAB1 WHERE F4 IS NOT NULL
--..........其他字段
UNION ALL
SELECT ID, VAL = F31,
DATE = DATEADD(Day, CAST(STUFF(F31, 1, 1, '') as int), '2005-12-31')
FROM TAB1 WHERE F31 IS NOT NULL
)A
ON A.DATE = B.DATE-- 显示结果
SELECT * FROM TAB2
GODROP TABLE TAB1, TAB2