Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 比较行,根据值(即日期和状态列)在SQL Server 2012或SSIS 2012中插入新行_Sql Server_Ssis_Sql Server 2012 - Fatal编程技术网

Sql server 比较行,根据值(即日期和状态列)在SQL Server 2012或SSIS 2012中插入新行

Sql server 比较行,根据值(即日期和状态列)在SQL Server 2012或SSIS 2012中插入新行,sql-server,ssis,sql-server-2012,Sql Server,Ssis,Sql Server 2012,我需要比较单个表中三个不同列“MSName”、“MSStatus”和“MSDate”的行。“ID”是位置标识符,“MSName”是在特定位置完成的几个里程碑的列。请暂时忽略“CalcSAED”列,因为我已将其作为解决方案的一部分创建。示例表请参考下面的屏幕截图: 规则: 条件1:如果(MSName=“FTA”和MSStatus=“Actual”,则“插入具有相同列值的新行,用于(“ID”、“SName”、“MSStatus”、“MSDate”),但MSName应为“SAEDR” 条件2:否则,如

我需要比较单个表中三个不同列“MSName”、“MSStatus”和“MSDate”的行。“ID”是位置标识符,“MSName”是在特定位置完成的几个里程碑的列。请暂时忽略“CalcSAED”列,因为我已将其作为解决方案的一部分创建。示例表请参考下面的屏幕截图:

规则:

条件1:如果(MSName=“FTA”和MSStatus=“Actual”,则“插入具有相同列值的新行,用于(“ID”、“SName”、“MSStatus”、“MSDate”),但MSName应为“SAEDR”

条件2:否则,如果(MSNAME=“Acc AAA”和MSStatus=“Actual”且条件1=FALSE,则“插入具有相同列值的新行(“ID”、“SName”、“MSStatus”、“MSDate”),但MSNAME应为“SAEDR”

条件3:否则,如果(MSNAME=“SAED”和MSStatus=“Actual”以及条件1和条件2=FALSE,则“为(“ID”、“SName”、“MSStatus”、“MSDate”)插入具有相同列值的新行,但MSNAME应为“SAEDR”

下一步呢

样本数据

CREATE TABLE D1 (

             ID varchar(2)
            ,SName varchar(50)
            ,MSName varchar(50)
            ,MSStatus Varchar(10)
            ,MSDate Date
            ,CalcSAED varchar(10)
    )

INSERT INTO D1 VALUES ('A1', 'Melbourne', 'FTA', 'Actual', '2016-02-12', NULL)
    INSERT INTO D1 VALUES ('A1', 'Melbourne', 'Acc AAA', 'Pending', '2016-02-13', NULL)
    INSERT INTO D1 VALUES ('A1', 'Melbourne', 'SAED', 'Pending', '2016-02-14', NULL)
    INSERT INTO D1 VALUES ('A2', 'Melbourne1', 'FTA', 'Pending', '2016-02-15', NULL)
    INSERT INTO D1 VALUES ('A2', 'Melbourne1', 'Acc AAA', 'Actual', '2016-02-12', NULL)
    INSERT INTO D1 VALUES ('A2', 'Melbourne1', 'SAED', 'Pending', '2016-02-16', NULL)
    INSERT INTO D1 VALUES ('A3', 'Melbourne2', 'FTA', 'Pending', '2016-02-17', NULL)
    INSERT INTO D1 VALUES ('A3', 'Melbourne2', 'Acc AAA', 'Pending', '2016-02-12', NULL)
    INSERT INTO D1 VALUES ('A3', 'Melbourne2', 'SAED', 'Actual', '2016-02-11', NULL)
    INSERT INTO D1 VALUES ('A4', 'Melbourne3', 'FTA', 'Pending', '2016-02-10', NULL)
    INSERT INTO D1 VALUES ('A4', 'Melbourne3', 'Acc AAA', 'Pending', '2016-02-19', NULL)
    INSERT INTO D1 VALUES ('A4', 'Melbourne3', 'SAED', 'Pending', '2016-02-16', NULL)

    INSERT INTO D1 VALUES ('A5', 'Melbourne4', 'FTA', 'Actual', '2016-02-13', NULL)
    INSERT INTO D1 VALUES ('A5', 'Melbourne4', 'Acc AAA', 'Actual', '2016-02-16', NULL)
    INSERT INTO D1 VALUES ('A5', 'Melbourne4', 'SAED', 'Actual', '2016-02-18', NULL)

    INSERT INTO D1 VALUES ('A6', 'Melbourne5', 'FTA', 'Actual', '2016-02-13', NULL)
    INSERT INTO D1 VALUES ('A6', 'Melbourne5', 'Acc AAA', 'Pending', '2016-02-16', NULL)
    INSERT INTO D1 VALUES ('A6', 'Melbourne5', 'SAED', 'Actual', '2016-02-18', NULL)


    INSERT INTO D1 VALUES ('A7', 'Melbourne6', 'FTA', 'Actual', '2016-02-13', NULL)
    INSERT INTO D1 VALUES ('A7', 'Melbourne6', 'Acc AAA', 'Actual', '2016-02-16', NULL)
    INSERT INTO D1 VALUES ('A7', 'Melbourne6', 'SAED', 'Actual', '2016-02-18', NULL)
到目前为止,我糟糕的解决方案是:

  • 创建一个名为“CalcSAED”的列,并将其更新为“True”以获取有效的
  • 将两个select语句合并为“True”值,并将其“MSName”更改为“SAEDR”,然后完成原始表
  • PS:我甚至不确定我的查询是否100%可靠,但到目前为止,我使用的是示例表

    我的解决方案代码:

    UPDATE D1 SET CalcSAED = NULL
    
    
        UPDATE D1
           SET CalcSAED = 'True'
    
          FROM D1 
    INNER JOIN D1 AS D2
            ON D2.ID = D1.ID
    INNER JOIN D1 AS D3
            ON D1.ID = D3.ID 
         WHERE (D1.MSName LIKE 'FTA' AND D1.MSStatus LIKE 'Actual')
            OR ((D1.MSName LIKE 'Acc AAA' AND D1.MSStatus LIKE 'Actual') AND (D2.MSName LIKE 'FTA' AND D2.MSStatus NOT LIKE 'Actual'))
            OR (D1.MSName LIKE 'SAED' AND D1.MSStatus LIKE 'Actual') AND  (D2.MSName LIKE 'Acc AAA' AND D2.MSStatus NOT LIKE 'Actual') AND (D3.MSName LIKE 'FTA' AND D3.MSStatus NOT LIKE 'Actual') 
    
    GO
    
        ;WITH TempCTE(ID, SName, MSName, MSStatus, MSDate, CalcSAED) AS
    
            (
    
    
                SELECT ID, SName, MSName = 'SAED-R', MSStatus, MSDate, CalcSAED 
                FROM D1
                WHERE CalcSAED LIKE 'True'
    
                UNION ALL
    
                SELECT ID, SName, MSName , MSStatus, MSDate, CalcSAED 
                FROM D1
    
    
    
            )
    
            SELECT * FROM TempCTE
            ORDER BY ID ASC
    

    基本上,我正在使用SSIS包将数据从SQL Server数据库导入到另一个SQL Server。目前,我计划在SSIS包执行结束时运行此查询。我不确定这是否是正确的方法。因此,如果您对此有任何建议和建议,我们将不胜感激。提前感谢。

    在我的情况下,我将根据您在问题中分享的结果,我使用的组件包括:

    -OLEDB源

    -多播

    -有条件拆分

    -3个派生列

    -联合所有人

    -排序

    -OLEDB目的地

    这是您的数据流的图片:

    在组件条件拆分中,我添加了3个条件,如下图所示:

    然后我添加3个派生列以将行的值替换为te value with。您是否需要查看下图以了解更多详细信息

    对于所有
    派生列

    最后添加一个排序组件,如下图所示

    最后:添加您的
    目标表
    ,这就是最终结果:

      ID    SName   MSName  MSStatus    MSDate  CalcSAED
    A1  Melbourne   Acc AAA Pending 2016-02-13  NULL
    A1  Melbourne   FTA Actual  2016-02-12  NULL
    A1  Melbourne   SAED    Pending 2016-02-14  NULL
    A1  Melbourne   SAEDR   Actual  2016-02-12  NULL
    A2  Melbourne1  Acc AAA Actual  2016-02-12  NULL
    A2  Melbourne1  FTA Pending 2016-02-15  NULL
    A2  Melbourne1  SAED    Pending 2016-02-16  NULL
    A2  Melbourne1  SAEDR   Actual  2016-02-12  NULL
    A3  Melbourne2  Acc AAA Pending 2016-02-12  NULL
    A3  Melbourne2  FTA Pending 2016-02-17  NULL
    A3  Melbourne2  SAED    Actual  2016-02-11  NULL
    A3  Melbourne2  SAEDR   Actual  2016-02-11  NULL
    A4  Melbourne3  Acc AAA Pending 2016-02-19  NULL
    A4  Melbourne3  FTA Pending 2016-02-10  NULL
    A4  Melbourne3  SAED    Pending 2016-02-16  NULL
    A5  Melbourne4  Acc AAA Actual  2016-02-16  NULL
    A5  Melbourne4  FTA Actual  2016-02-13  NULL
    A5  Melbourne4  SAED    Actual  2016-02-18  NULL
    A5  Melbourne4  SAEDR   Actual  2016-02-16  NULL
    A6  Melbourne5  Acc AAA Pending 2016-02-16  NULL
    A6  Melbourne5  FTA Actual  2016-02-13  NULL
    A6  Melbourne5  SAED    Actual  2016-02-18  NULL
    A6  Melbourne5  SAEDR   Actual  2016-02-18  NULL
    A7  Melbourne6  Acc AAA Actual  2016-02-16  NULL
    A7  Melbourne6  FTA Actual  2016-02-13  NULL
    A7  Melbourne6  SAED    Actual  2016-02-18  NULL
    A7  Melbourne6  SAEDR   Actual  2016-02-18  NULL
    

    您的目标表是源表?否。这将从源表转到另一个目标表。感谢您的努力。看起来正是我所需要的。让我试试您的解决方案。很快会更新您:)嘿!一个快速的。在ID A6和A7的结果表中,如果我根据给定的规则只需要一次SAEDR插入怎么办?我认为如果我调整了条件,它应该会工作?工作正常!感谢你的帮助。你是冠军!很高兴帮助你!!你想删除重复的
    SAEDR
    ?如果我你的答案解决你的问题请检查我的答案谢谢