如何将多条数据库记录合并为一行多列展示?
解决方案:用户状态按日期分组列转行统计
根据你的需求,我们可以用两种常见的SQL写法来实现目标格式,不需要复杂的LEFT JOIN:
通用写法(支持所有关系型数据库)
用CASE WHEN配合聚合函数直接分组统计,逻辑清晰易理解:
SELECT create_date AS 日期, -- 统计当日待审核用户数 COUNT(CASE WHEN status = '待审核' THEN 1 END) AS 待审核数, -- 统计当日通过用户数 COUNT(CASE WHEN status = '通过' THEN 1 END) AS 通过数, -- 统计当日拒绝用户数 COUNT(CASE WHEN status = '拒绝' THEN 1 END) AS 拒绝数 FROM user_info -- 按日期分组 GROUP BY create_date -- 按日期排序 ORDER BY create_date;
也可以用SUM替代COUNT,效果完全一致:
SELECT create_date AS 日期, SUM(CASE WHEN status = '待审核' THEN 1 ELSE 0 END) AS 待审核数, SUM(CASE WHEN status = '通过' THEN 1 ELSE 0 END) AS 通过数, SUM(CASE WHEN status = '拒绝' THEN 1 ELSE 0 END) AS 拒绝数 FROM user_info GROUP BY create_date ORDER BY create_date;
简洁写法(适用于SQL Server、Oracle等支持PIVOT的数据库)
如果你的数据库支持PIVOT语法,可以用更简洁的方式实现:
SELECT create_date AS 日期, [待审核] AS 待审核数, [通过] AS 通过数, [拒绝] AS 拒绝数 FROM ( -- 子查询获取基础数据 SELECT create_date, status FROM user_info ) AS SourceTable -- 按status字段做行转列,统计每个状态的数量 PIVOT ( COUNT(status) FOR status IN ([待审核], [通过], [拒绝]) ) AS PivotTable ORDER BY create_date;
补充说明
你之前尝试LEFT JOIN未成功,通常是因为多表JOIN时没有正确处理分组逻辑,或者关联条件导致数据重复/缺失。上面的两种方法都直接基于原表做聚合统计,不需要额外关联表,能避免这类问题。
内容的提问来源于stack exchange,提问作者samg
相关产品推荐
相关产品推荐

