Sql server 比较行,根据值(即日期和状态列)在SQL Server 2012或SSIS 2012中插入新行
我需要比较单个表中三个不同列“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” 下一步呢 样本数据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:否则,如
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)
到目前为止,我糟糕的解决方案是:
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
?如果我你的答案解决你的问题请检查我的答案谢谢