如何在 MySQL Select 语句中按多列分组

Posted

技术标签:

【中文标题】如何在 MySQL Select 语句中按多列分组【英文标题】:How to do grouping by multiple columns in MySQL Select Statement 【发布时间】:2021-12-12 01:34:53 【问题描述】:

以上是我在 mysql 中的 Select 语句的输出,任何人都可以帮助我,以便我可以按 exp_date 和用户名对以上结果进行分组。所以同一日期的任何用户名只有 1 行

它应该在用户名 S.M.gadekar 的 2021 年 10 月 26 日的单行中显示住宿、寄宿、洗衣和运输列的值。

尝试了所有想法,但我没有得到确切的结果。对此的实际优化解决方案是什么?

【问题讨论】:

GROUP BY username, exp_date 请参阅dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html,了解可用于聚合每个组中其他列的函数。 这能回答你的问题吗? Is it possible to GROUP BY multiple columns using MySQL? 如果您可以使用MAX()SUM(),请参阅Andrew 的回答,否则请参阅[groupwise-maximum] 标签。 @RickJames 您可以使用[tag:] 语法如groupwise-maximum 来链接cmets 中的标签 【参考方案1】:

您从组中选择您想要的列,并为其余列使用某种聚合和别名 - 因为看起来一个日期和名称的所有费用值都设置在一行中,MAX() 可以工作, 但SUM() 是这里聚合的更安全选择。要按多列分组,只需在 GROUP BY 语句中使用逗号分隔的列列表:

SELECT username, exp_date, 
    SUM(lodging) AS lodging,
    SUM(boarding) AS boarding,
    SUM(laundry) AS laundry,
    SUM(conveyance) AS conveyance
FROM table
GROUP BY exp_date, username;

也就是说该表可能应该被规范化为三个表,因为这看起来只是第二范式 - 但设计工作得很好。

sqlFiddle

如果您特别希望一天为一个人提供一行,而不是每天为每个人提供一行数据,那么您的 where 子句位于您的 from 和 group 子句之间:

sqlFiddle

【讨论】:

【参考方案2】: 多列组由 , 分隔 GROUP BY exp_date ,用户名;

【讨论】:

以上是关于如何在 MySQL Select 语句中按多列分组的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 中按多列分组

在 PyQt 模型中按多列排序

在 SELECT 语句中按错误分组,导致 Oracle 中出现 ORA-00979 错误代码

在 MySQL 中按多列获取重复行

根据给定的因子在 R 中按函数分组获取多列的百分比值

如何在一行中按顺序对所有项目的总金额进行分组