有没有办法通过对多个列进行分组来进一步压缩 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;
您将在下方看到一个 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;