如何在 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 语句中按多列分组的主要内容,如果未能解决你的问题,请参考以下文章