Получение повторяющихся строк после двух JOINS и команды UNION - PullRequest
0 голосов
/ 02 июня 2019

У меня есть 3 таблицы следующим образом:

  • Клиент с идентификатором клиента
  • Карты с идентификатором карты и FK с идентификатором клиента
  • Транзакции с идентификатором транзакции и FK с идентификатором карты

Каждый клиент может иметь больше, чем карточка, а карточка может совершать больше, чем транзакция.

Я хочу сделать следующее: Получить 3 клиентов с меньшим количеством транзакций.

Моя проблема: мой запрос возвращает клиента 2 раза.

SELECT TOP 3 
    ClientId, Name, LastName, QtyTrans 
FROM
    (SELECT 
         ClientId, Name, LastName, 0 AS QtyTrans 
     FROM 
         Client 
     JOIN 
         Card ON ClientId = IdClient 
     WHERE 
         CardId NOT IN (SELECT CardId FROM Transaction) 
     GROUP BY 
         ClientId, Name, LastName

     UNION

     SELECT 
         ClientId, Name, LastName, COUNT(TransId) AS QtyTrans
     FROM  
         Client 
     JOIN 
         Card c ON ClientId = IdClient 
     JOIN 
         Transaction t ON c.CardId = t.CardId
     GROUP BY 
         ClientId, Name, LastName
    ) TotalTrans 
ORDER BY 
    QtyTrans

Когда у клиента есть транзакции с каждой картой, просто возвращается одна строка, но если у одной из карт нет транзакций, возвращается одна строка с счетом 0, а другая - с суммой транзакций по другим картам.

Результат:

11  Martin  Camejo          0,
7   Matias  Barrenechea 0,
7   Matias  Barrenechea 2

Любая помощь?

1 Ответ

2 голосов
/ 02 июня 2019

Я хочу сделать следующее: Получить 3 клиентов с наименьшим количеством транзакций.

Я не вижу, что UNION имеет отношение к этому вопросу.Вы просто хотите LEFT JOIN и GROUP BY:

SELECT TOP (3) cl.ClientId, cl.Name, cl.LastName,
       COUNT(t.CardId) AS QtyTrans 
FROM Client cl LEFT JOIN
     Card c
     ON cl.ClientId = c.IdClient LEFT JOIN  -- don't know which table has which column
     Transaction t
     ON t.CardId = c.CardId
GROUP BY cl.ClientId, cl.Name, cl.LastName
ORDER BY QtyTrans ASC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...