代码之家  ›  专栏  ›  技术社区  ›  user1777929

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

  •  1
  • user1777929  · 技术社区  · 8 年前

    我有两张桌子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 回复  |  直到 7 年前
        1
  •  1
  •   sgeddes    8 年前

    你的问题是没有匹配的结果 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
    
        2
  •  1
  •   Gordon Linoff    8 年前

    移除 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)    
    

    这似乎有悖常理。但是,没有 按组 即使所有行都被过滤掉,也保证只返回一行。用一个 小组通过 ,聚合查询为每个组返回一行。如果筛选出所有行,则不返回任何行。

    推荐文章