SQL如何按账户分组并按月汇总各账户grandTotal总和
按账户分月汇总销售额的SQL实现
要实现按ledgerName(账户)分组、统计每个账户各自然月grandTotal总和并排序,只需要在你原有查询基础上增加日期粒度转换、聚合函数、分组和排序逻辑即可。
调整后可直接运行的SQL(以MySQL为例)
SELECT tbl_AccountLedger.ledgerName, DATE_FORMAT(tbl_SalesMaster.date, '%Y-%m') AS stat_month, SUM(tbl_SalesMaster.grandTotal) AS monthly_grand_total FROM tbl_SalesMaster INNER JOIN tbl_AccountLedger ON tbl_SalesMaster.ledgerId = tbl_AccountLedger.ledgerId GROUP BY tbl_AccountLedger.ledgerName, DATE_FORMAT(tbl_SalesMaster.date, '%Y-%m') ORDER BY tbl_AccountLedger.ledgerName ASC, stat_month ASC;
其他数据库适配说明
你只需要替换语句中日期转年月的函数部分,即可在对应数据库运行:
- SQL Server:替换为
FORMAT(tbl_SalesMaster.date, 'yyyy-MM')或DATETRUNC(month, tbl_SalesMaster.date) - PostgreSQL:替换为
TO_CHAR(tbl_SalesMaster.date, 'YYYY-MM')或DATE_TRUNC('month', tbl_SalesMaster.date) - Oracle:替换为
TO_CHAR(tbl_SalesMaster.date, 'YYYY-MM')或TRUNC(tbl_SalesMaster.date, 'MONTH')
注意事项
GROUP BY后的字段必须和SELECT中非聚合计算的字段完全对应,否则会触发分组语法错误- 如果需要限定统计的时间范围,在
FROM/JOIN语句后、GROUP BY前增加WHERE条件即可,例如统计2024年全年数据可以加:WHERE tbl_SalesMaster.date >= '2024-01-01' AND tbl_SalesMaster.date < '2025-01-01' - 当前内连接写法只会返回有交易记录的账户+月份组合,如果需要补全无交易月份的0值汇总,需要先生成账户与全量统计月份的笛卡尔积维表,再左关联交易表做聚合。
内容的提问来源于stack exchange,提问作者BernardtSpies
相关产品推荐
相关产品推荐

