把表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

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/4318/4318049.xml?temp=.7960474
    这里有个例子,参考一下
      

  2.   

    -- 处理示例-- 示例数据
    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
      

  3.   

    -- 测试结果ID         DATE                    VAL
    ---------- ----------------------- -----------
    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 行受影响)
      

  4.   

    -- 上面是sql 2005支持的-- 下面是 SQL 2000-- 示例数据
    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