【问题标题】:SQL Query with join and sum带有连接和求和的 SQL 查询
【发布时间】:2019-04-18 20:47:43
【问题描述】:

我想获取所有发票总额的总和以及订购的所有项目的总和(通过数量)。当我添加连接时,总和是错误的,似乎事情被计算为双倍。

我该如何解决这个问题?

select
sum(invoices_items.item_quantity) as registration_count,
sum(invoices.total_incl_vat) as registration_price
from  invoices
inner join invoices_items on invoices_items.invoice_id = invoices.id; 

【问题讨论】:

  • invoices_items 表中是否也有total_incl_vat 列?
  • @Alex 不。我需要两个不同表的总和。
  • 你为什么要加一个计数和一个价格——你不把它相乘吗?你的测试用例到底是什么?
  • 请展示您的整个数据模型 -- invoices 和 invoice_items 中的字段是什么
  • 注意,表格使用单数是惯例——因此表格名称将是 invoice(每行一个发票)和 invoice_item(每行一个发票项目)

标签: mysql join sum


【解决方案1】:

当您加入发票的每一行时,结果中出现的次数与包含项目的次数一样多。这将导致发票金额增加。

如果您只想将两个总和放在一行中,您可以使用 SELECT 而不使用 FROM 子句和子查询。

SELECT (SELECT sum(item_quantity)
               FROM invoice_items) registration_count,
       (SELECT sum(total_incl_vat)
               FROM invoices) registration_price;

【讨论】:

    【解决方案2】:

    发票项目似乎有不止一个发票记录 所以你可以这样做

    select
    invoices.id,
    (select sum(invoices_items.item_quantity from invoices_items where invoices_items.invoice_id = invoices.id) as registration_count,
    sum(invoices.total_incl_vat) as registration_price
    from  invoices
    group by invoices.id
    

    【讨论】:

      【解决方案3】:

      使用您的方法,您需要先聚合它们,然后再执行JOIN

      SELECT  t.id, registration_price, registration_count
      FROM 
      (SELECT id, SUM(invoices.total_incl_vat) AS registration_price FROM invoices GROUP BY id) t
      INNER JOIN
      (SELECT  invoices_id, SUM(invoices_items.item_quantity AS registration_count FROM invoices_items GROUP BY invoices_id) tt 
      ON tt.invoices_id = t.id
      GROUP BY t.id WITH ROLLUP;
      

      【讨论】:

        猜你喜欢
        • 2021-12-28
        • 1970-01-01
        • 2021-06-10
        • 2018-11-14
        • 1970-01-01
        • 2016-10-20
        • 2011-12-05
        • 2016-03-20
        • 1970-01-01
        相关资源
        最近更新 更多