如何按样本分组统计各功能组物种数并转为列输出的SQL实现
SQL统计样本总物种数及各功能分组物种数查询语句
假设你的数据表名为 species_records,实际使用时替换为你自己的表名即可。
你需要的是典型的条件聚合行转列需求,Group 属于SQL保留关键字,查询时需要用特殊符号包裹避免语法报错。
查询语句(统计去重物种数)
如果同一个样本下重复出现的同一物种仅计数1次,使用如下标准SQL语句:
SELECT Sample, COUNT(DISTINCT Species) AS N_especies, COUNT(DISTINCT CASE WHEN `Group` = 'A' THEN Species END) AS Group_A, COUNT(DISTINCT CASE WHEN `Group` = 'B' THEN Species END) AS Group_B, COUNT(DISTINCT CASE WHEN `Group` = 'C' THEN Species END) AS Group_C, COUNT(DISTINCT CASE WHEN `Group` = 'D' THEN Species END) AS Group_D, COUNT(DISTINCT CASE WHEN `Group` = 'E' THEN Species END) AS Group_E FROM species_records GROUP BY Sample ORDER BY Sample;
查询语句(统计记录条数)
如果你需要的是统计每个分组下的原始记录条数(同物种多条记录累计计数),去掉语句中的DISTINCT即可:
SELECT Sample, COUNT(Species) AS N_especies, COUNT(CASE WHEN `Group` = 'A' THEN 1 END) AS Group_A, COUNT(CASE WHEN `Group` = 'B' THEN 1 END) AS Group_B, COUNT(CASE WHEN `Group` = 'C' THEN 1 END) AS Group_C, COUNT(CASE WHEN `Group` = 'D' THEN 1 END) AS Group_D, COUNT(CASE WHEN `Group` = 'E' THEN 1 END) AS Group_E FROM species_records GROUP BY Sample ORDER BY Sample;
小提示:如果使用SQL Server数据库,把包裹
Group的反引号替换为方括号[Group];Oracle数据库替换为双引号"Group"即可。
说明
CASE WHEN 不满足条件时默认返回NULL,COUNT函数会自动忽略NULL值,因此即使某个分组在样本中没有数据,也会返回0,和你给出的示例输出要求完全匹配。
内容的提问来源于stack exchange,提问作者Alvaro Jorquera
相关产品推荐
相关产品推荐

