SQL 为什么我不能使用group by替代where子句
问题描述
Mysql不执行group-by版本。我试图理解为什么会发生这种情况,因为据我了解,“group by”语法是在聚合之后使用的,但为什么在这里不起作用?
正确的where子句版本:
SELECT
c.client_id,
c.name,
(SELECT AVG(invoice_total) FROM invoices) AS average,
(SELECT sum(invoice_total) FROM invoices where client_id=c.client_id) AS total_sales,
(SELECT average - total_sales) AS differences
FROM clients c;
按组分组的版本-错误
SELECT
c.client_id,
c.name,
(SELECT AVG(invoice_total) FROM invoices) AS average,
(SELECT sum(invoice_total) FROM invoices GROUP BY client_id) AS total_sales,
(SELECT average - total_sales) AS differences
FROM clients c;
解决方案
您可能会遇到错误“子查询返回多行”。
现在,如果我们看看你的分组子查询:
select sum(invoice_total) from invoice group by client_id;
这个特定查询将返回每个客户的发票总金额。
现在,如果你把这个查询作为子查询使用,你应该在外部查询中关联它。
select c.client_id, c.client_name, (select sum(invoice_total) from invoice) as total_sales from client c;
你期望的结果是
client’s id | client’s name | total_sales
但是你得不到这个结果,因为内部子查询会返回一个完整的关系,它与外部查询的ID和名称没有关联。
你期望的total_sales值对应于外部查询的client_id,所以我们必须使用“where”子句来连接c.client_id=client_id,这在“group by”查询中没有发生。