我正在编写一个数据修复SQL脚本,该脚本使用同一ID下两行中的数据插入新记录。
我的表如下所示:
AccountID | ActivityId | Debit | Credit | DisplayDetails | TransactionDate
=========================================================================
1 1 100 0 Display Details1 2015-02-02
1 2 0 0 Display Details1 2018-02-02
1 1 300 0 Display Details1 1999-02-02
1 2 0 0 Display Details1 2000-02-02
2 1 200 0 Display Details2 2017-02-02
2 2 0 0 Display Details2 2017-04-06
2 12 0 200 Display Details2 2015-04-06
3 1 200 0 Display Details3 2015-02-04
3 3 0 200 Display Details3 2015-06-02
4 1 100 0 Display Details4 2016-02-02
4 2 0 0 Display Details4 2016-06-02
活动 ID 1 写入借方
ActivityId 2 不写入任何内容,但在我的条件下是必需
的活动 ID 3 写入信用
活动 ID 12 写入信用
我的数据解决方法是查找具有关联活动 ID 2 的活动 ID 1,但在同一帐户 ID 下找不到关联的 12 或 3。
我编写了一个满足以下条件的查询:
SELECT A.AccountID
INTO #temp
FROM Account A WITH(NOLOCK)
WHERE ActivityId IN (1, 2, 3, 12)
GROUP BY A.AccountID
HAVING SUM(CASE WHEN A.ActivityId = 1 THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN A.ActivityId = 2 THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN A.ActivityId = 3 THEN 1 ELSE 0 END) = 0 AND
SUM(CASE WHEN A.ActivityId = 12 THEN 1 ELSE 0 END) = 0;
现在我有了受影响的数据,我需要使用关联帐户 ActivityId 2 中的显示详细信息和活动 ID 1 中的事务日期插入具有 ActivityId 12 的新记录。 我还需要使用活动 ID 1 中的借方值插入到字段中的贷方。
这背后的背景是同一 AccountId 下的每个活动 1 和 2 也应该有一个活动 ID 12,但是其中一些被遗漏了,因此需要此修复脚本。
以下是我的方法:
-- Uses AccountIds retrieved above to then get data from parent table.
SELECT A.AccountID, A.ActivityId, A.DebitAmount, A.CreditAmount, A.DisplayDetails, A.TransactionDate
INTO #temp2
FROM Account A
JOIN #temp T
ON T.AccountID = A.AccountID
-- Get ActivityId 2 data
SELECT *
INTO #ActivityTwo
FROM #temp2 T
WHERE T.ActivityId = 2
INSERT INTO Account (AccountID, ActivityId, DebitAmount, CreditAmount, DisplayDetails, TransactionDate)
SELECT T.AccountID, 12, 0, T.DebitAmount, S.DisplayDetails, T.TransactionDate
FROM #temp2 T WITH(NOLOCK)
JOIN #ActivityTwo S
ON T.AccountID = S.AccountID
WHERE T.ActivityId = 1
但是,如果我在同一 AccountId 下有多个活动 1 和活动 2,我的脚本将插入重复的行。
AccountID | ActivityId | Debit | Credit | DisplayDetails | TransactionDate
=========================================================================
1 1 100 0 Display Details1 2015-02-02
1 2 0 0 Display Details1 2018-02-02
1 1 300 0 Display Details1 1999-02-02
1 2 0 0 Display Details1 2000-02-02
1 12 0 100 Display Details1 2015-02-02
1 12 0 100 Display Details1 2015-02-02
1 12 0 300 Display Details1 1999-02-02
1 12 0 300 Display Details1 1999-02-02
2 1 200 0 Display Details2 2017-02-02
2 2 0 0 Display Details2 2017-04-06
2 12 0 200 Display Details2 2015-04-06
3 1 200 0 Display Details3 2015-02-04
3 3 0 200 Display Details3 2015-06-02
4 1 100 0 Display Details4 2016-02-02
4 2 0 0 Display Details4 2016-06-02
4 12 0 100 Display Details4 2016-02-02
如您所见,AccountID 1 有 4 条额外的 12 条记录,而它应该只有两条 12 条记录。
帐户ID 4工作正常,因此我认为问题在于具有多个ActivityId 1和2的帐户。
为什么会这样?我该怎么做才能解决这个问题?
有没有人有更好的方法来解决这个问题?
任何帮助将不胜感激。
谢谢!
由于您没有任何方法将活动 1 行与活动 2 行相关联,我认为您需要在第二次插入时选择一个 SELECT DISTINCT。
SELECT DISTINCT A.AccountID, A.ActivityId, A.DebitAmount, A.CreditAmount,
A.DisplayDetails, A.TransactionDate
INTO #temp2
FROM Account A
JOIN #temp T
ON T.AccountID = A.AccountID