【问题标题】:Avoiding duplicate rows among three tables避免三个表之间的重复行
【发布时间】:2019-11-05 05:46:29
【问题描述】:

我正在编写包含一些计算的 3 个表的查询。以客户名称命名的表可能在表 debit_items 中有一个或多个借方,每个借方在表 credit_items 中可以有一个或多个贷方。在这里,我应该找到每个客户的总借方和总贷方,但问题是如果借方有多个贷方,则该借方将被计算为重复。

customers1debit_items2credit_items3

我写的查询是这样的:

SELECT customers.*,
       sum(CASE
             WHEN debit_items.customer_id = customers.id THEN
              debit_items.debit_amount
             ELSE
              0
           END) as total_debit,
       sum(CASE
             WHEN credit_items.debit_id = debit_items.id THEN
              credit_items.credit_amount
             ELSE
              0
           END) as total_credit
  FROM customers
  LEFT JOIN debit_items
    ON customers.id = debit_items.customer_id
   AND debit_items.deleted = '0'
  LEFT JOIN credit_items
    ON debit_items.id = credit_items.debit_id
   AND credit_items.deleted = '0'
 GROUP BY customers.id

如果有人帮助我,我将不胜感激。

【问题讨论】:

  • '每个借记可以有一个或多个贷记'-真的,你永远不会有零贷记吗?

标签: mysql sql left-join


【解决方案1】:

group 首先是基于debit_idcredit items 及其sum(),然后加入debit 表。

SELECT customers.*,
       sum(CASE
             WHEN debit_items.customer_id = customers.id THEN
              debit_items.debit_amount
             ELSE
              0
           END) as total_debit,
       sum(CASE
             WHEN credit_items.debit_id = debit_items.id THEN
              credit_items.credit_amount
             ELSE
              0
           END) as total_credit
  FROM customers
  LEFT JOIN debit_items
    ON customers.id = debit_items.customer_id
   AND debit_items.deleted = '0'   
  LEFT JOIN 
    (SELECT SUM(credit_amount) as credit_amount, debit_id from credit_items GROUP BY debit_id) as credit_items
        ON debit_items.id = credit_items.debit_id
   AND credit_items.deleted = '0'
 GROUP BY customers.id

【讨论】:

  • 非常感谢。你真的是最棒的。它现在可以正常工作了。
【解决方案2】:

LEFT JOINs 转换为INNERs 以仅返回完全匹配:

SELECT c.*,
       sum(CASE
             WHEN di.customer_id = c.id THEN
              d.debit_amount
             ELSE
              0
           END) as total_debit,
       sum(CASE
             WHEN ci.debit_id = di.id THEN
              ci.credit_amount
             ELSE
              0
           END) as total_credit
  FROM customers c
  JOIN debit_items di
    ON c.id = di.customer_id
   AND di.deleted = '0'
  JOIN credit_items ci
    ON di.id = ci.debit_id
   AND ci.deleted = '0'
 GROUP BY c.id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-03
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多