需要帮助编写查询,该查询插入新行,从同一 ID 下的两行中提取其数据



我正在编写一个数据修复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

最新更新