我正在编写一个SQL脚本,该脚本将使用来自同一BankID下两行的数据来插入新记录。
我的表格如下所示:
BankID | ActivityId | DisplayDetails | TransactionDate | TradingId
============================================================================
1 5 Displayer1 2015-02-02 00:00:00.000 1
1 6 DisplayThis1 2016-02-02 00:00:00.000 1
1 5 Displayer2 1999-02-02 00:00:00.000 2
1 6 DisplayThis2 2000-02-02 00:00:00.000 2
我的解决方法是查找找到每个5,6组合,并插入带有ActivityId 66的新行,该行从ActivityId 5获取DisplayDetails,从ActivityId 6获取TransactionDate。
我的查询如下:
SELECT *
INTO #EightActivity
FROM Bank B
WHERE B.ActivityId = 6
INSERT INTO #Bank (BankID, ActivityId, DisplayDetails, TransactionDate)
SELECT B.BankID, 66, S.DisplayDetails, B.TransactionDate
FROM Bank B
JOIN #EightActivity S
ON B.BankID = S.BankID
WHERE B.ActivityId = 5
但是,当我运行SELECT * FROM Bank时,每5和6行我得到66行,而每5和6组合我只能得到1 66行。
BankID | ActivityId | DisplayDetails | TransactionDate | TradingId
=============================================================================
1 5 Displayer1 2015-02-02 00:00:00.000 1
1 6 DisplayThis1 2016-02-02 00:00:00.000 1
1 5 Displayer2 1999-02-02 00:00:00.000 2
1 6 DisplayThis2 2000-02-02 00:00:00.000 2
1 66 DisplayThis1 2015-02-02 00:00:00.000 NULL
1 66 DisplayThis2 2015-02-02 00:00:00.000 NULL
1 66 DisplayThis1 1999-02-02 00:00:00.000 NULL
1 66 DisplayThis2 1999-02-02 00:00:00.000 NULL
我相信我可以利用TradingId实现所需的功能,但是我不确定如何实现。
任何帮助将不胜感激。
谢谢!
答案 0 :(得分:2)
您可以尝试通过条件汇总函数
插入数据INSERT INTO #Bank (BankID, ActivityId, DisplayDetails, TransactionDate)
SELECT BankID,66,
MAX(CASE WHEN ActivityId = 5 THEN DisplayDetails END),
MAX(CASE WHEN ActivityId = 6 THEN TransactionDate END)
FROM Bank
GROUP BY BankID,TradingId
答案 1 :(得分:2)
在我看来,像简单的联接一样可以解决问题:
INSERT INTO #Bank (BankID, ActivityId, DisplayDetails, TransactionDate, TradingId)
SELECT t0.BankID, 66, t0.DisplayDetails, t1.TransactionDate, t0.TradingId
FROM Bank t0
JOIN Bank t1
ON t0.BankID = t1.BankID
AND t0.TradingId = t1.TradingId
WHERE t0.ActivityId = 5
AND t1.ActivityId = 6
当然,假设活动应同时由BankID
和TradingId
链接。请注意,我还插入了TradingId
,以便您可以将新行与其源行链接起来。 (不确定是否需要它,但是比后悔更安全,对吧?)
要根据您的注释使用ActivityId
6处理多个记录,可以使用子查询来代替使用自我联接:
INSERT INTO #Bank (BankID, ActivityId, DisplayDetails, TransactionDate, TradingId)
SELECT t0.BankID,
66,
t0.DisplayDetails,
(
SELECT TOP 1 TransactionDate
Bank t1
WHERE t0.BankID = t1.BankID
AND t0.TradingId = t1.TradingId
AND t1.ActivityId = 6
ORDER BY TransactionDate
),
t0.TradingId
FROM Bank t0
WHERE t0.ActivityId = 5