为什么我不能使用“group by”而不是“where”子句?#Mysql #sql

Why can't I use "group by" instead of a "where"clause? #Mysql #sql

提问人:Hao 提问时间:10/21/2023 最后编辑:Hao 更新时间:10/21/2023 访问量:64

问:

Mysql 不执行 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;

group-by 版本 - 错误

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;

提前感谢您的所有回答!

我试图理解为什么“分组依据”语法在这里不适用的逻辑。

sql mysql group-by where-子句

评论

0赞 Tim Biegeleisen 10/21/2023
示例数据和预期结果将对您的问题有所帮助。
1赞 nacho 10/21/2023
什么意思?你得到错误了吗?没有得到预期的结果?和 是不同的指令,因此您的查询将获得不同的结果Mysql doesn't execute the group-by versionwheregroup by
0赞 Thorsten Kettner 10/21/2023
而且,不,“where 子句版本”不正确。它是无效的,因为您不能在 select 子句中定义别名并在同一 select 子句中使用该别名。DBMS 不必自上而下进行选择。它可以决定首先评估“差异”,但要做到这一点,必须已经知道“平均”和“total_sales”。
0赞 Jonas Metzler 10/21/2023
如果没有示例数据和预期结果,则纯粹是猜测哪个查询最适合您。

答:

1赞 kritikadvn 10/21/2023 #1

您可能会收到错误“子查询返回多行”。 现在,如果我们按子查询查看您的分组: 选择 Sum(invoice_total) from Invoice Group by client_id; 此特定查询将在结果中给出一个关系,其中包含每个客户端的invoice_total之和。

现在,如果将此查询用作子查询,则应将其与外部查询相关联。

选择c.client_id、c.client_name、(从发票中选择 Sum(invoice_total))作为客户 C 的total_sales;

您将期望的结果是 客户 ID |客户名称 |total_sales

但是你不会得到它,因为内部子查询导致了一个完整的关系,它与外部查询的 ID 和名称无关。 您期望total_sales值对应于外部查询的client_id因此,我们必须使用“where”子句加入 c.client_id=client_id这在“group by”查询中不会发生。

我希望你能明白。对不起,如果你不这样做,我尽力解释。

评论

0赞 Hao 10/21/2023
感谢您的明确回应!!现在我明白了为什么它不会反过来工作的原因。