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
相关产品推荐
相关产品推荐

