【问题标题】:Is there a way to condense rows further in a SQL query through grouping on more than one column?有没有办法通过对多个列进行分组来进一步压缩 SQL 查询中的行?
【发布时间】:2019-01-27 21:41:09
【问题描述】:

您将在下面看到一个 SQL 查询,该查询成功返回给定商家的收入...除非该商家的任何发票碰巧有不止一次成功的交易。在这种情况下,它会将每个发票项目的收入与其成功交易次数相加。

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

当您给GROUP BY 多个列时,它只会将两列中相同的行组合在一起,从而导致表格的精简程度较低而不是更加精简。有没有办法在这个查询上按照第二组的方式运行一些东西,这样它就不会多次添加任何发票的发票项目的收入?

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;

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助。我在您的查询中看不到任何内容,而是返回有关项目的信息。
  • 我已经开始写一个不同的查询。感谢您指出这一点!

标签: sql postgresql group-by grouping distinct


【解决方案1】:

您的 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;

【讨论】:

    猜你喜欢
    • 2018-11-08
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    相关资源
    最近更新 更多