Mysql
MySQL:SUM() 與連接和分組一起使用時返回多行
我期望通過查詢,它使用 SUM() 返回一行,包含所有行的總數。但是,它返回多行。SUM() 沒有添加行。
SELECT SUM(DISTINCT `sales`.`sale_shipping`) as `total_shipping` FROM `sales` LEFT JOIN `contacts` ON `sales`.`contact_id` = `contacts`.`contact_id` LEFT JOIN `salespayments` ON `salespayments`.`sale_id` = `sales`.`sale_id` LEFT JOIN `contactsadditionalreps` ON `contacts`.`contact_id` = `contactsadditionalreps`.`contact_id` WHERE `salespayments`.`payment_type`!='Refund' GROUP BY `sales`.`sale_id`, `sales`.`sale_shipping`;
我期待著:
--- total_shipping --- 70
但我得到:
--- total_shipping --- 10 20 40
這似乎是由連接和分組引起的。如何獲得真正的 SUM()?
架構和數據可以在這裡找到: https ://www.db-fiddle.com/f/2ex4gAf4SCFzdYEk7GNpaz/0
當您使用該
GROUP BY
子句時,您的結果集將包含您要分組的欄位的每個唯一值組合的一行。sales.sales_id
您在該欄位和範例數據集中的查詢組有多個不同的sales_ids
. 這就是為什麼您要返回多行,並且SUM()
每行中的數據僅跨越該行的源行sales_id
。由於您沒有使用
SELECT
這些欄位,並且聽起來您想要一個SUM()
跨所有行的欄位,因此您不需要在GROUP BY
此處使用子句。沒有它的以下查詢應該是您所需要的:SELECT SUM(DISTINCT `sales`.`sale_shipping`) as `total_shipping` FROM `sales` LEFT JOIN `contacts` ON `sales`.`contact_id` = `contacts`.`contact_id` LEFT JOIN `salespayments` ON `salespayments`.`sale_id` = `sales`.`sale_id` LEFT JOIN `contactsadditionalreps` ON `contacts`.`contact_id` = `contactsadditionalreps`.`contact_id` WHERE `salespayments`.`payment_type`!='Refund';
另外,請注意,因為您明確過濾 on ,所以您
WHERE salespayments.payment_type !='Refund';
不需要使用LEFT (outer) JOIN
onsalespayments
。salespayments.payment_type
為了不為空,每一行都必須在連接上匹配。因此,您可以使用 anINNER JOIN
代替,這在某些情況下可能更有效。