Sql 使用Group By时计算多个值

Sql 使用Group By时计算多个值,sql,oracle,Sql,Oracle,如果这个问题含糊不清,我很抱歉,我是SQL新手,遇到了一些问题。我试图找出每个体重组的人数。计算该数字并显示每个类的数量 我认为我的问题在于当时的表达方式。我是否需要为每个体重组创建一个变量进行比较 多谢各位 SELECT (CASE WHEN pl_weight <180 THEN 1 WHEN pl_weight >=180 AND pl_weight <200 THEN 2 WHEN pl_weight >=200 AND pl_weight <220 TH

如果这个问题含糊不清,我很抱歉,我是SQL新手,遇到了一些问题。我试图找出每个体重组的人数。计算该数字并显示每个类的数量

我认为我的问题在于当时的表达方式。我是否需要为每个体重组创建一个变量进行比较

多谢各位

SELECT 
(CASE WHEN pl_weight <180 THEN 1
WHEN pl_weight >=180 AND pl_weight <200 THEN 2
WHEN pl_weight >=200 AND pl_weight <220 THEN 3
ELSE 4 END),
count(1) "Less than 280", count(2)"180-200", count(3)"200-220",count(4)"More than 220"  
FROM dl_player
GROUP BY (CASE WHEN pl_weight <180 THEN 1
WHEN pl_weight >=180 AND pl_weight <200 THEN 2
WHEN pl_weight >=200 AND pl_weight <220 THEN 3
ELSE 4
END));

一种方法是使用如下条件聚合:

SELECT 
    SUM(CASE WHEN "pl_weight" <180 THEN 1 ELSE 0 END) AS "Less than 280",
    SUM(CASE WHEN "pl_weight" >=180 AND "pl_weight" <200 THEN 1 ELSE 0 END) AS "180-200",
    SUM(CASE WHEN "pl_weight" >=200 AND "pl_weight" <220 THEN 1 ELSE 0 END) AS "200-220",
    SUM(CASE WHEN "pl_weight" >=220 THEN 1 ELSE 0 END) AS "More than 220"  
FROM dl_player
计数没有按你所希望的方式工作;它统计行数,或者更具体地说,统计其中的值不为NULL的行数。您可以使用条件聚合(如@jpw的答案中所示)完成此操作,也可以使用子查询完成此操作:

SELECT weight, COUNT(*) FROM (
    SELECT CASE WHEN pl_weight <180 THEN "Less than 180"
        WHEN pl_weight >=180 AND pl_weight <200 THEN "180-200"
        WHEN pl_weight >=200 AND pl_weight <220 THEN "200-220"
        ELSE "More than 220" END AS weight
      FROM dl_player
) GROUP BY weight;

顺便说一句,我不确定你是否注意到了,但在你的最后一个案例中,你有一个一个接一个的错误。如果值大于等于220,则返回4或大于220。

谢谢,这很有帮助。我想你必须使用组,所以这是造成我的问题。@ USSR248621如果我的答案有助于解决您的问题,请考虑将其标记为接受。
SELECT weight, COUNT(*) FROM (
    SELECT CASE WHEN pl_weight <180 THEN "Less than 180"
        WHEN pl_weight >=180 AND pl_weight <200 THEN "180-200"
        WHEN pl_weight >=200 AND pl_weight <220 THEN "200-220"
        ELSE "More than 220" END AS weight
      FROM dl_player
) GROUP BY weight;