Как показать значения, которые имеют подходящую пару на сервере SQL - PullRequest
3 голосов
/ 20 сентября 2019

У меня есть такая таблица

---------------------------------------------
Id | TransactionId | Amount | Account| crdr | 
---------------------------------------------
1  |       1       | 100    | 11111  |   1  |
2  |       2       | 130    | 13133  |   1  |
3  |       1       | 100    | 12111  |   2  |
4  |       2       | 130    | 13233  |   2  |
5  |       2       | 110    | 12122  |   1  |

Что мне нужно для отображения, так это показать эти записи в виде пар (я сгруппировал их по транзакции, сумме).

SELECT TransactionId ,Amount , Account, CrDr
FROM Table1 ORDER BY TransactionId  ASC,Amount  ASC, CrDr ASC

Но я хочу игнорировать записи, у которых нет пары, в качестве примера для этого набора результатов, приведенного выше, результат должен выглядеть следующим образом:

---------------------------------------------
TransactionId | Amount | Account| crdr | 
---------------------------------------------
      1       | 100    | 11111  |   1  |
      1       | 100    | 12111  |   2  |
      2       | 130    | 13133  |   1  |
      2       | 130    | 13233  |   2  |

Может кто-нибудь предложить решение дляэто.

Ответы [ 3 ]

1 голос
/ 20 сентября 2019

Вы можете использовать коррелированный подзапрос с условием NOT EXISTS, чтобы убедиться, что существует другая запись с такими же TransactionId и Amount:

SELECT TransactionId ,Amount , Account, CrDr
FROM Table1 t
WHERE EXISTS (
    SELECT 1
    FROM Table1 t1
    WHERE 
        t.id <> t1.id 
        AND t.TransactionId = t1.TransactionId
        AND t.Amount = t1.Amount
)
ORDER BY TransactionId  ASC,Amount  ASC, CrDr ASC

Демонстрация в БДСкрипка :

TransactionId | Amount | Account | CrDr
------------: | -----: | ------: | ---:
            1 |    100 |   11111 |    1
            1 |    100 |   12111 |    2
            2 |    130 |   13133 |    1
            2 |    130 |   13233 |    2
0 голосов
/ 20 сентября 2019

Попробуйте: это самое простое решение этой проблемы

;with cte
as
(
    select TransactionId, Amount
    from Table1
    group by TransactionId, Amount
    having count(*) > 1
)
select * 
from Table1 t
inner join cte c on t.TransactionId = c.TransactionId and t.Amount = c.Amount
0 голосов
/ 20 сентября 2019

Попробуйте это:

DECLARE @DataSource TABLE
(
     [Id] INT
    ,[TransactionId] INT
    ,[Amount] INT
    ,[Account] INT 
    ,[crdr] INT
);

INSERT INTO @DataSource ([Id], [TransactionId], [Amount], [Account], [crdr])
VALUES (1, 1, 100, 11111, 1)
      ,(2, 2, 130, 13133, 1)
      ,(3, 1, 100, 12111, 2)
      ,(4, 2, 130, 13233, 2)
      ,(5, 2, 110, 12122, 1);

WITH DataSource AS
(
    SELECT *
          ,COUNT(*)  OVER (PARTITION BY [TransactionId], [Amount]) AS [Count]
    FROM @DataSource
)
SELECT *
FROM DataSource
WHERE [Count] = 2
ORDER BY TransactionId  ASC,Amount  ASC, CrDr ASC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...