在SQL中未给出预期结果的联接

在SQL中未给出预期结果的联接,sql,sql-server,join,Sql,Sql Server,Join,我有两张桌子,表F和表D 表F给出了账户金融交易的详细信息(付款、通行费、利息)。表D显示了拖欠状态(如果用户未向帐户付款)。它显示不同的状态代码。0,1,2,11(意思不同) 我的表格结构如下: Table F ============ ------------------------------------------- |AccountId|TypeCode |BusinessDate|TransAmt| -----------------------------------------

我有两张桌子,表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|
--------------------

通过删除
分组:

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
的聚合查询也保证只返回一行。使用
分组依据
,聚合查询将为每个组返回一行。如果筛选出所有行,则不会返回任何行。

您的问题是没有与您的
where
条件匹配的结果。我认为您实际上正在寻找使用
条件聚合
。我还使用了
外部联接
,以防不匹配:

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

谢谢你,戈登。当我使用您的代码时,得到的结果是:Null 0.00。我想要的结果是12345 0.00。这可能吗?正如我在昨天的帖子中提到的,删除
分组依据
不是您想要的。您的
,其中
标准是问题所在--它不返回任何结果。因此,您无法获得所需的值
0
,而是
null
。您可以使用下面我的
条件聚合建议来获得预期结果。
外部连接
也可能有帮助,也可能没有帮助(我怀疑没有,但不会造成伤害)。