有没有办法通过对多个列进行分组来进一步压缩 SQL 查询中的行?

Is there a way to condense rows further in a SQL query through grouping on more than one column?

您将在下方看到一个 SQL 查询,该查询成功 returns 给定商家的收入...除非该商家的任何发票恰好有不止一次成功的交易。在这种情况下,它将计算每个发票项目的收入乘以其成功交易的数量。

如果我还没有加入商家并按 merchant.id 分组,我会按 invoices.id

分组

当您给 GROUP BY 多列时,它只会将两列中相同的行组合在一起,从而导致 table 更简洁而不是更简洁。有没有办法 运行 根据此查询的第二组行进行某些操作,这样它就不会多次添加任何发票的发票项目的收入?

SELECT  merchants.id,
      sum(invoice_items.unit_price * invoice_items.quantity) as total_revenue FROM merchants
  INNER JOIN invoices
    ON invoices.merchant_id = merchants.id
  INNER JOIN invoice_items
    ON invoice_items.invoice_id = invoices.id
  INNER JOIN transactions
    ON transactions.invoice_id = invoices.id
WHERE transactions.result = "success"
  AND merchants.id = ?
GROUP BY merchants.id;

您的 N 对 M 关系导致发票项目被多次合计。一种解决方案是将每张发票的总计计算移动到子查询:

SELECT  merchants.id, invoice_items_total.total_revenue
FROM merchants
  INNER JOIN invoices
    ON invoices.merchant_id = merchants.id
  INNER JOIN 
    (
      SELECT invoice.id, sum(unit_price * quantity) as total_revenue 
      FROM invoices_item 
      GROUP BY invoice.id 
    ) invoice_items_total ON invoice_items_total.invoice_id = invoices.id
  INNER JOIN transactions
    ON transactions.invoice_id = invoices.id
WHERE transactions.result = "success"
  AND merchants.id = ?
GROUP BY merchants.id;