SQL-запрос: ПРИСОЕДИНЯЙТЕ три таблицы, а затем не показывает результаты после присоединения к 3-й таблице

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

Таблица LoanMaster

LoanID  BranchName  DisbursementDate  DisbursementAmount
12345   H1          01-01-18          25000
12346   A1          05-01-18          20000
12347   M1          06-02-18          16000

Коллекционная таблица

LoanID  TransactionDate Amount
12345   05-02-18        500
12346   06-02-18        600

Таблица просроченной коллекции

LoanID  TransactionDate Amount
12345   05-02-18    200
12346   07-02-18    300

Требуемый вывод

LoanID  BranchName  TransactionDate Collection Amount   Overdue Amount  
12345   H1          05-02-18        500                 200 
12346   A1          06-02-18        600                 NULL    
12346   A1          07-02-18        NULL                300 
12347   M1          NULL            NULL                NULL    

я применил следующие два запроса, чтобы объединить две таблицы

"QRY_Test2":

SELECT   c.LoanID LoanID, date(c.TransactionDate) TransDate, (c.Amount) Amt,
         d.Amount = NULL FROM  Collection c 
UNION
SELECT  d.LoanID LoanID, date(d.TransactionDate) TransDate, c.Amount = NULL,
         (d.Amount) as Amt FROM  Overdue Amount d 

а затем сгруппируйте, чтобы получить уникальные результаты с именем finalTable:

SELECT LoanID, TransDate, sum("Amount"), sum("Amt") FROM  "QRY_Test2"
GROUP BY LoanID, TransDate 

то я получаю следующий результат:

LoanID  TransactionDate Collection Amount   Overdue Amount  
12345   05-02-18        500                 200 
12346   06-02-18        600                 NULL    
12346   07-02-18        NULL                300 

Затем, если я применяю левое соединение с LoanMaster, я не получаю никаких результатов:

Select LoanID, BranchName, TransactionDate, CollectionAmount, OverdueAmount from LoanMaster lm LEFT JOIN on FinalTable f lm.LoanID = f.loanid

Просто хотел понять, в чем проблема, и мне нужен вышеупомянутый требуемый результат.


person UM1979    schedule 26.02.2018    source источник


Ответы (1)


Сложность здесь заключается в создании таблицы, которая содержит в одной записи собранные и просроченные суммы для данного дня и кредита. Мы можем объединить таблицы Collection и OverdueCollection, а затем выполнить поворот по займу и дате. Затем просто присоедините основную таблицу займов к этому подзапросу.

SELECT
    lm.LoanID,
    lm.BranchName,
    t.TransactionDate,
    t.CollectionAmount,
    t.OverdueAmount
FROM LoanMaster lm
LEFT JOIN
(
    SELECT LoanID, TransactionDate,
        MAX(CASE WHEN type = 1 THEN Amount END) AS CollectionAmount,
        MAX(CASE WHEN type = 2 THEN Amount END) AS OverdueAmount
    FROM
    (
        SELECT LoanID, TransactionDate, Amount, 1 AS type
        FROM Collection
        UNION ALL
        SELECT LoanID, TransactionDate, Amount, 2
        FROM OverdueCollection
    ) t
    GROUP BY
        LoanID, TransactionDate
) t
    ON lm.LoanID = t.LoanID;
person Tim Biegeleisen    schedule 26.02.2018
comment
Идеология и решение хороши и работают нормально. Спасибо за помощь. Я тоже изучил оператор CASE, так как я новичок в написании сложных запросов. - person UM1979; 27.02.2018
comment
@ UM1979 Можете ли вы отметить этот ответ правильным? Зеленая галочка слева от ответа. Это также поможет другим, у которых есть такая же проблема, как у вас, которые сталкиваются с вашим вопросом. - person Tim Biegeleisen; 27.02.2018