sql复制重复

时间:2016-06-27 04:38:02

标签: sql replication sybase

我试图填写Col4'使用' Col1'使用上述值的空值和Col3'。以下是对列的简要说明:

  • Col1 - 用户输入日期
  • Col2 - 日历日期
  • Col3 - Col1中日期之间的差异
  • Col4 - 参赛金额
  • 目前的数据是什么样的:

     |   Col1          |   Col2          |   Col3       |   Col4
     |   2016-01-01    |   2016-01-01    |   3          |   $10
     |   null          |   2016-01-02    |   null       |   null
     |   null          |   2016-01-03    |   null       |   null
     |   2016-01-04    |   2016-01-04    |   1          |   $2
     |   2016-01-05    |   2016-01-05    |   2          |   $7
     |   null          |   2016-01-06    |   null       |   null
     |   2016-01-07    |   2016-01-07    |   3          |   $5
     |   null          |   2016-01-08    |   null       |   null
     |   null          |   2016-01-09    |   null       |   null
    
    预期成绩:

     |   Col1          |   Col2          |   Col3       |   Col4
     |   2016-01-01    |   2016-01-01    |   3          |   $10
     |   null          |   2016-01-02    |   null       |   $10
     |   null          |   2016-01-03    |   null       |   $10
     |   2016-01-04    |   2016-01-04    |   1          |   $2
     |   2016-01-05    |   2016-01-05    |   2          |   $7
     |   null          |   2016-01-06    |   null       |   $7
     |   2016-01-07    |   2016-01-07    |   3          |   $5
     |   null          |   2016-01-08    |   null       |   $5
     |   null          |   2016-01-09    |   null       |   $5
    

    该公式通过计算Col3中的数字然后将Col4中的相应数量复制到下面的行来工作。 Col3定义了下面的行数(包括它自己的行)。

    我目前正在使用Sybase。我对如何做到这一点没有任何想法。任何帮助将不胜感激。 注意:这是一个数据样本,日期从2000年到2016年

    1 个答案:

    答案 0 :(得分:0)

    在SQL Server中通过给定的样本数据,我们可以通过使用CTE

    来实现上述结果集

    示例数据:

    declarE  @Table1 TABLE 
        (Col1 varchar(10), Col2 varchar(10), Col3 varchar(4), Col4 varchar(4))
    ;
    
    INSERT INTO @Table1
        (Col1, Col2, Col3, Col4)
    VALUES
        ('2016-01-01', '2016-01-01', '3', '$10'),
        (NULL, '2016-01-02', NULL, NULL),
        (NULL, '2016-01-03', NULL, NULL),
        ('2016-01-04', '2016-01-04', '1', '$2'),
        ('2016-01-05', '2016-01-05', '2', '$7'),
        (NULL, '2016-01-06', NULL, NULL),
        ('2016-01-07', '2016-01-07', '3', '$5'),
        (NULL, '2016-01-08', NULL, NULL),
        (NULL, '2016-01-09', NULL, NULL)
    ;
    

    脚本:

    WITH cte 
         AS (SELECT T1.Col1, 
                    T1.Col2,
                    T1.Col3, 
    
                    Col4 = COALESCE(T1.Col4, (SELECT TOP 1 Col4 
                                          FROM   @Table1 T2 
                                          WHERE  T2.Col2 < T1.Col2
                                                 AND Col4 IS NOT NULL 
                                          ORDER  BY Col2 DESC)) 
             FROM   @Table1 T1) 
    UPDATE T 
    SET    
           T.Col4 = C.Col4 
    FROM   @Table1 T 
           INNER JOIN cte C 
                   ON T.col2 = C.col2 
    WHERE  T.col1 IS NULL 
            OR T.col2 IS NULL 
            OR T.col3 IS NULL 
    
            Select * from @Table1