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

SQL列值聚合方法及Batsman_detail表出局类型统计查询求助

SQL聚合相关问题解答

嘿,我来帮你搞定这两个SQL问题:

1. SQL中如何聚合列内的值

聚合列内的值主要分两种常见场景,我分别给你举例说明:

数值类聚合(求和、计数、平均等)

这类需求通常用GROUP BY分组,配合内置的聚合函数来实现,比如SUM()、COUNT()、AVG()、MAX()、MIN()这些。举个例子,统计每个部门的总薪资:

SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department;

字符串类聚合(合并列内的多个字符串)

如果是要把同一分组下的多个字符串合并成一个,不同数据库有对应的函数:

  • MySQL/MariaDB:用GROUP_CONCAT(),比如把每个部门的员工姓名合并成逗号分隔的列表:
    SELECT department, GROUP_CONCAT(employee_name SEPARATOR ', ') AS employee_list
    FROM employees
    GROUP BY department;
    
  • PostgreSQL:用STRING_AGG():
    SELECT department, STRING_AGG(employee_name, ', ') AS employee_list
    FROM employees
    GROUP BY department;
    
  • SQL Server(2017+):同样用STRING_AGG():
    SELECT department, STRING_AGG(employee_name, ', ') AS employee_list
    FROM employees
    GROUP BY department;
    

2. 统计指定国家各出局类型的次数

这个需求需要把行数据转成列展示,用条件聚合就能完美解决,也就是在聚合函数里嵌套CASE WHEN来判断统计条件。直接给你写好SQL语句,再解释下逻辑:

SELECT
    Opposition,
    COUNT(CASE WHEN dismissal = 'caught' THEN 1 END) AS caught,
    COUNT(CASE WHEN dismissal = 'bowled' THEN 1 END) AS bowled,
    COUNT(CASE WHEN dismissal = 'run out' THEN 1 END) AS runout,
    COUNT(CASE WHEN dismissal = 'not out' THEN 1 END) AS notout
FROM Batsman_detail
WHERE Opposition IN ('Pakistan', 'Australia', 'Srilanka')
GROUP BY Opposition
ORDER BY Opposition;

逻辑说明:

  • WHERE子句先过滤出你指定的三个国家,避免统计无关数据;
  • CASE WHEN会在匹配到对应出局类型时返回1,否则返回NULL,而COUNT()函数会自动忽略NULL值,这样就精准统计出了每个类型的次数;
  • GROUP BY Opposition按国家分组,确保每个国家只输出一行结果;
  • 如果某个国家没有某类出局记录,会自动显示0,完全符合你给出的示例输出格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:02:47