Mysql

MySQL:SUM() 與連接和分組一起使用時返回多行

  • April 14, 2022

我期望通過查詢,它使用 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) JOINon salespaymentssalespayments.payment_type為了不為空,每一行都必須在連接上匹配。因此,您可以使用 anINNER JOIN代替,這在某些情況下可能更有效。

引用自:https://dba.stackexchange.com/questions/310950