СОЕДИНЕНИЯ, не дающие ожидаемых результатов в SQL - PullRequest
0 голосов
/ 07 июня 2018

У меня есть две таблицы: Таблица F и Таблица D.

Таблица F содержит подробную информацию о финансовых операциях по счету (платеж, пошлина, проценты).Таблица D показывает состояние просрочки (если пользователь не внес платеж в счет).Он показывает разные коды состояния.0, 1, 2, 11 (что означает разные вещи).

Мои таблицы имеют следующую структуру:

Table F
============
------------------------------------------- 
|AccountId|TypeCode |BusinessDate|TransAmt|
------------------------------------------- 
|12345    | PYMT    |2016-06-22  |   10.54|
------------------------------------------- 
|12345    | TOLL    |2016-06-15  |   04.00|
------------------------------------------- 
|12345    | INTR    |2016-05-26  |   01.66|
------------------------------------------- 
|12345    | TOLL    |2016-04-10  |   04.00|
------------------------------------------- 

Table D
==========
-----------------------------------------------
|AccountId|FromID|ToID|CreatedDate            |
----------------------------------------------- 
|12345    |     0|   2|2016-12-25 00:12:44.453|
----------------------------------------------- 
|12345    |     2|   1|2017-04-02 07:16:46.770|
----------------------------------------------- 
|12345    |     1|  11|2017-07-12 16:16:36.747|
-----------------------------------------------

Я пытаюсь запустить код, чтобы найти СУММУ всех произведенных платежейв учетной записи ПОСЛЕ того, как учетная запись перешла в код состояния 11 (ToID)

Мой код:

SELECT F.AccounttID
      ,ISNULL(SUM(TransAmt), 0) Payments

FROM F INNER JOIN D ON F.AccounttID = D.AccountId

WHERE AccountId = 12345   
  AND TypeCode = 'PYMT'   
  AND F.BusinessDate >= D.CreatedDate  
  AND ToID = 11 
--AND F.BusinessDate >= (SELECT CreatedDate FROM D WHERE F.AccounttID = D.AccountId AND ToID = 11)    

GROUP BY F.AccountID, F.TypeCode

Результаты, которые я получаю:

--------------------
|AccountID|Payments|
--------------------
|         |        |
--------------------

РезультатыЯ хотел бы, чтобы:

--------------------
|AccountID|Payments|
--------------------
|   12345|     0.00|
--------------------

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Ваша проблема в том, что нет результатов, соответствующих вашим критериям where.Я думаю, что вы на самом деле хотите использовать conditional aggregation.Я также использовал outer join на случай отсутствия совпадения:

SELECT F.AccounttID
      ,SUM(CASE WHEN F.BusinessDate >= D.CreatedDate THEN F.TransAmt ELSE 0 END) Payments
FROM F 
    LEFT JOIN D ON F.AccounttID = D.AccountId AND D.ToId = 11
WHERE F.AccountId = 12345   
    AND F.TypeCode = 'PYMT'   
GROUP BY F.AccountID
0 голосов
/ 07 июня 2018

Удалите GROUP BY:

SELECT MAX(F.AccounttID) as AccounttID,
       COALESCE(SUM(TransAmt), 0) Payments
FROM F INNER JOIN
     D
     ON F.AccounttID = D.AccountId
WHERE AccountId = 12345 AND 
      TypeCode = 'PYMT' AND  
      F.BusinessDate >= D.CreatedDate AND
      ToID = 11 
--AND F.BusinessDate >= (SELECT CreatedDate FROM D WHERE F.AccounttID = D.AccountId AND ToID = 11)    

Это может показаться нелогичным.Но запрос агрегации без GROUP BY гарантированно вернет ровно одну строку, даже если все строки отфильтрованы.При GROUP BY запрос агрегации возвращает по одной строке на группу.Если все строки отфильтрованы, то строки не возвращаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...