Есть ли способ сжимать строки в запросе SQL путем группировки более чем в один столбец? - PullRequest
0 голосов
/ 28 января 2019

Ниже вы увидите SQL-запрос, который успешно возвращает доход для данного продавца ... если только в одном из счетов этого продавца не было более одной успешной транзакции.В этом случае он будет суммировать доход каждого элемента счета с его количеством успешных транзакций.

Если бы я еще не присоединился к продавцам и не группировал по merchant.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;

1 Ответ

0 голосов
/ 28 января 2019

У вас есть отношение 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;
...