两个GROUPBY项 不能汇总出所有记录的问题

  • 基础环境如下
sudo -u postgres psql sanguo -c "CREATE TABLE heroes(id serial, name VARCHAR(20),fight int,intelligence int,city VARCHAR(20),nation VARCHAR(20),items VARCHAR(20));"
sudo -u postgres psql sanguo -c  "INSERT INTO heroes(name, fight, intelligence,nation,city,items) VALUES('刘备',60,65,'蜀','涿','双股剑'),('关羽',96,96,'蜀','解良','青龙偃月刀 赤兔马'),('张飞',98,60,'蜀','涿','丈八蛇矛'),('吕布','100','86','董卓','长安','方天画戟'),('马超','97','86','蜀','天水','铁骑尖'),('赵云','97','90','蜀','蓟','龙胆'),('典韦','96','57','魏','陈留','铁戟'),('许褚','96','65','魏','陈留',''),('甘宁','95','84','吴','建邺','双匕首'),('庞德','95','80','魏','天水',''),('黄忠','94','85','蜀','长沙','猛将弓'),('文丑','94','79','袁绍','蓟',''),('太史慈','93','82','吴','建邺',''),('华雄','92','82','董卓','长安',''),('孙策','92','92','吴','建邺','霸王枪'),('颜良','92','80','袁绍','蓟',''),('张辽','92','93','魏','蓟',''),('魏延','91','81','蜀','信阳',''),('夏侯渊','91','85','魏','陈留',''),('孙坚','90','93','吴','建邺',''),('文鸯','90','77','魏','蓟',''),('夏侯惇','90','89','魏','陈留','碎岩'),('周泰','90','77','吴','建邺',''),('曹彰','88','82','魏','许昌',''),('姜维','88','89','蜀','天水',''),('曹操','85','96','魏','陈留','孟德新书 玉玺 铜雀台赋'),('孙权','83','91','吴','建邺',''),('诸葛亮','60','98','蜀','南阳',''),('董卓','60','50','董卓','长安','魔王扑'),('袁绍','60','60','袁绍','长安','王道剑');"
  • 执行如下指令
\c sanguo

SELECT 
    city,
    nation,
    count(*) 
FROM 
    heroes
WHERE 
    fight > 90
GROUP BY
    nation,
    city
ORDER BY
    nation,
    city
;
  • 得到的结果是

img

  • 出生于南阳、隶属于蜀国的诸葛亮并没有被统计进来
  • 这是什么原因
  • 如果想要 修改使得能够统计出完整30名英雄的结果
  • 应该怎么修改?

结合chatgpt和个人分析sql语句,
分析问题出在SELECT语句中的WHERE条件。当前的条件是fight > 90,这将过滤掉战斗力不满足条件的英雄,导致诸葛亮被排除在外。要想统计出完整的30名英雄结果,你需要修改WHERE条件。

要修改使得能够统计出完整30名英雄的结果,可以将WHERE条件修改为fight >= 0,这样将不会过滤掉任何一个英雄。

以下是完整的修改后的SQL查询语句:


\c sanguo

SELECT 
    city,
    nation,
    count(*) 
FROM 
    heroes
WHERE 
    fight >= 0
GROUP BY
    nation,
    city
ORDER BY
    nation,
    city
;


执行以上修改后的查询语句,就能够统计出完整的30名英雄的结果,包括诸葛亮在内。

【相关推荐】




如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^