使用同一ID下的多个相关行使用新行插入的SQL脚本

时间:2018-08-19 22:35:15

标签: sql sql-server

我正在编写一个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实现所需的功能,但是我不确定如何实现。

任何帮助将不胜感激。

谢谢!

2 个答案:

答案 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

sqlfiddle

答案 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

当然,假设活动应同时由BankIDTradingId链接。请注意,我还插入了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