You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多GROUP BY语句使用求助:按location和day分组查询需求

嘿,我来帮你搞定按地点(location)和日期(day)分组的SQL查询问题!先给你假设一个常见的场景和表结构,这样能给你更具体的方案,要是你的实际表结构或者需求有差异,直接调整就行~

先假设一个常见的表结构和期望结果

示例表结构(比如叫business_stats)

  • id (INT, 主键)
  • location (VARCHAR, 存储地点名称,比如'北京朝阳店'、'上海浦东店')
  • day (DATE, 统计日期,比如'2024-05-01')
  • customer_count (INT, 当日到店客户数)
  • sales_amount (DECIMAL(10,2), 当日销售额)

期望返回结果

按「地点+日期」的组合分组,每个组返回:地点名称、日期、当日总客户数、当日总销售额,结果按地点升序、日期升序排列。


基础GROUP BY解决方案

最直接的写法就是把location和day同时放到GROUP BY子句里,配合聚合函数计算统计值:

SELECT 
    location,
    day,
    SUM(customer_count) AS total_customers,
    SUM(sales_amount) AS total_sales,
    COUNT(*) AS record_count -- 可选:统计该分组下的原始记录条数(比如一天内有多条明细的话)
FROM business_stats
GROUP BY location, day
ORDER BY location, day;

原理说明:GROUP BY location, day会把location和day的组合值完全相同的行归为一组,比如「北京朝阳店+2024-05-01」是一个独立分组,「上海浦东店+2024-05-01」是另一个分组。


处理datetime类型的日期字段

如果你的day字段是DATETIME/TIMESTAMP类型(比如存储的是'2024-05-01 14:30:00'这种带时分秒的时间),想要按自然日分组的话,需要先提取日期部分:

MySQL/MariaDB写法

SELECT 
    location,
    DATE(day) AS group_date, -- 提取纯日期部分
    SUM(customer_count) AS total_customers
FROM business_stats
GROUP BY location, DATE(day)
ORDER BY location, group_date;

PostgreSQL写法

SELECT 
    location,
    DATE_TRUNC('day', day)::DATE AS group_date,
    SUM(customer_count) AS total_customers
FROM business_stats
GROUP BY location, DATE_TRUNC('day', day)::DATE
ORDER BY location, group_date;

SQL Server写法

SELECT 
    location,
    CAST(day AS DATE) AS group_date,
    SUM(customer_count) AS total_customers
FROM business_stats
GROUP BY location, CAST(day AS DATE)
ORDER BY location, group_date;

进阶:分组汇总(ROLLUP用法)

如果想要同时得到「每日明细」和「地点总汇总」,可以用ROLLUP扩展分组:

SELECT 
    location,
    day,
    SUM(customer_count) AS total_customers
FROM business_stats
GROUP BY ROLLUP(location, day)
ORDER BY location, day;

这个查询会返回三类结果:

  1. 每个location+day的明细统计
  2. 每个location的总统计(此时day字段为NULL)
  3. 所有地点的全局总统计(此时location和day都为NULL)

关键注意事项

  • 字段匹配规则:SELECT子句里的非聚合字段,必须出现在GROUP BY子句里,或者被聚合函数包裹(比如SUM()/COUNT()),否则大部分数据库的严格模式会报错。
  • NULL值处理:如果location或day存在NULL值,GROUP BY会把所有NULL值归为一个独立分组。
  • 先过滤再分组:可以结合WHERE子句先筛选数据,再分组,比如只查2024年5月的数据:
SELECT 
    location,
    day,
    SUM(customer_count) AS total_customers
FROM business_stats
WHERE day BETWEEN '2024-05-01' AND '2024-05-31'
GROUP BY location, day
ORDER BY location, day;

内容的提问来源于stack exchange,提问作者hhh_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:33:07