【问题标题】:Sql Joining 3 Tables Query for Loan Total ResultSql Join 3 Tables 查询贷款总额结果
【发布时间】:2017-11-13 11:48:10
【问题描述】:

我必须从 3 个表中获取客户贷款总额,这两个表被给予贷款总和,另一个减去支付的金额,并且这些表具有共同的客户 ID。到目前为止,只有当所有表中都存在客户 ID 时,我才能得到结果,但如果它不存在于一个表中,我将不会在结果中得到客户。或者当我锚定到客户时,我得到了 NULL 客户 ID。

SELECT 
  AS1.C_ID AS [Customer ID],
  ISNULL(AS1.OldCustomerLoan, 0) AS [Old Loan],
  ISNULL(AS2.NewGivenLoan, 0) AS [New Given Loan],
  ISNULL(AS3.LoanPaid, 0) AS [PaidLoanAmount],
  (ISNULL(AS1.OldCustomerLoan, 0) + 
  ISNULL(AS2.NewGivenLoan, 0) - 
  ISNULL(AS3.LoanPaid,0) ) AS Total 
FROM
  Customer C
  LEFT OUTER JOIN
   (SELECT 
       MOC.C_ID,
       SUM(MOC.Quantity) AS OldCustomerLoan 
    FROM 
       Money_On_Customer MOC (NOLOCK)
    GROUP BY 
       MOC.C_ID) AS1 
    ON c.C_Id = AS1.C_Id
   LEFT OUTER JOIN 
(SELECT 
       NGL.C_ID 
       ,SUM(NGL.G_Take_Loan) AS NewGivenLoan 
    FROM 
       Given_Loan NGL   
    GROUP BY 
       NGL.C_ID) AS2
    ON c.C_Id = AS2.C_Id
LEFT OUTER JOIN 
   (SELECT 
       GLP.C_ID, SUM(GLP.G_P_Loan) AS LoanPaid 
    FROM 
       Given_Loan_Paid GLP 
    GROUP BY 
       GLP.C_ID ) AS3
ON c.C_Id = AS3.C_Id

这是我的两个结果的图片:

When I get NULL Customer IDs

When I don't get All the Customers

【问题讨论】:

  • 嗨。你不清楚。请使用足够的句子、短语、单词、句号和大写字母。请包含文本作为文本而不是链接/图像。请阅读minimal reproducible example 并采取行动。例如给出输入和期望的输出。例如,发布您的问题的最小代码。
  • @philipxy 我已经尽力了
  • 显然不是,因为你没有按照我的建议去做。

标签: sql sql-server sql-server-2008


【解决方案1】:

第一列需要使用 c.c_id

为了只获取它们存在于至少一个表中的记录,您可以将其添加到查询中,只需将当前查询放在点的位置,然后添加 leftid col

Select * 
From
(Select c.c_id custonerid, 
        Coalesce(Coalesce(as1.c_id,as2.c_id),as3.c_id) leftid,......
 From ....
) ilv
Where leftid is not null

你也许可以添加

Where coalesce(coalesce(as1.c_id,as2.c_id),as3.c_id) is not null 

到您的查询结束

【讨论】:

  • 为什么,这是该死的答案,而不是评论。当你得到的只是嘲笑时,我厌倦了试图提供帮助。
  • @AbBennett 嘿,谢谢,但是现在我有零值行,我该如何摆脱它?
  • 如果你指的是你离开外连接的表中的列,那是因为它们中不存在数据,并且 isnull 使它们为 0
  • @AbBennett Yh 我怎样才能只获取 3 个表中任何一个表中包含数据的行
  • 您要抑制没有 Money_On_Customer 和 Given_Loan 和 Given_Loan_Paid 的客户?
【解决方案2】:

@Ab Bennett 的回答是对的, 因为您应该使用主(主)表的主键列 如果客户 ID 在 as1 (Money_On_Customer) 中不可用,它将显示为空。 希望你能理解我的解释。

更新:

并使用以下获取客户 ID

COALESCE(c.C_Id, AS1.C_Id, AS2.C_Id)

您将首先获得非空客户 ID

【讨论】:

  • 好的,谢谢。但现在我只想获取 3 个表中任何一个表中包含数据的行,如果没有则不会显示。
【解决方案3】:

在@Ab Bennett 的帮助下,这是我的答案

Select * 
  From
  ( 
   SELECT 
     C.C_Name AS [Customer ID],
     ISNULL(AS1.OldCustomerLoan, 0) AS [Old Loan],
     ISNULL(AS2.NewGivenLoan, 0) AS [New Given Loan],
     ISNULL(AS3.LoanPaid, 0) AS [PaidLoanAmount],
     (ISNULL(AS1.OldCustomerLoan, 0) + 
     ISNULL(AS2.NewGivenLoan, 0) - 
     ISNULL(AS3.LoanPaid,0) ) AS Total 
   FROM
    Customer C
    LEFT OUTER JOIN
     (SELECT 
        MOC.C_ID,
        SUM(MOC.Quantity) AS OldCustomerLoan 
   FROM 
       Money_On_Customer MOC (NOLOCK)
    GROUP BY 
       MOC.C_ID) AS1 
    ON c.C_Id = AS1.C_Id
   LEFT OUTER JOIN 
     (SELECT 
       NGL.C_ID 
       ,SUM(NGL.G_Take_Loan) AS NewGivenLoan 
       FROM 
       Given_Loan NGL   
    GROUP BY 
    NGL.C_ID) AS2
    ON c.C_Id = AS2.C_Id
    LEFT OUTER JOIN 
     (SELECT 
       GLP.C_ID, SUM(GLP.G_P_Loan) AS LoanPaid 
    FROM 
       Given_Loan_Paid GLP 
    GROUP BY 
       GLP.C_ID ) AS3
   ON c.C_Id = AS3.C_Id) ilv
   Where not ([Old Loan] = 0 and [New Given Loan]=0 and PaidLoanAmount =0 )

【讨论】:

  • 这是不正确的,因为左表中的两行可能总计为 0,即 2 和 -2。您正在过滤掉这些。使用 null 来测试是否存在。你不能假设这不会发生
猜你喜欢
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多