使用 Case 或 RoundOff 在 PSQL 中进行计数和分组,并基于一个点进行透视?有多少学生通过了,有多少学生不及格

getting count and group by in PSQL using Case Or RoundOff and pivot based on a point? how many pupils have passed and how many have failed

学生可以通过或不通过测试。 总分 = 100。 0-30 分表示不及格。 31-100 分表示通过考试。

示例: 我有 table 名学生:

    CREATE TABLE pupil
    (id integer primary key,
     marks integer,
     maxmarks integer)

现在插入一些值,例如

insert into pupil (id, marks, maxmarks) values (1,11,100),(2,21,100),(3, 60,100);

现在 table 看起来像这样:

id | marks | maxmarks 
----+-------+----------
  1 |    11 |      100
  2 |    21 |      100
  3 |    60 |      100

我想看看有多少分在 0-30 分之间,有多少分在 31-100 分之间

所以我试着想着用group by,然后get count。

我写了这个查询:

    select marks, count(*) from pupil group by marks;

哪个 returns 我这个结果:

 marks | count 
-------+-------
    60 |     1
    11 |     1
    21 |     1

但我不想要那个结果,我期待这个结果。

 marks | count 
-------+-------
 0-30  |     2
30-100 |     1

0-30 也可以只是 0 或 30,我不在乎,我主要对计数列感兴趣。 我尝试了各种 group by 和 case 子句,还听说了一种叫做“pivot”的东西,但我不确定该怎么做?

最简单的方法是使用条件 GROUP BY:

demos:db<>fiddle

SELECT
    CASE 
        WHEN marks <= 30 THEN 
        '0-30'
        ELSE '31-100'
    END,
    COUNT(*)
FROM 
    pupil
GROUP BY (marks <= 30)

替代方法可以是使用 UNION 子句:

SELECT
    '0-30',
    COUNT(*)
FROM 
    pupil
WHERE marks <= 30

UNION

SELECT
    '31-100',
    COUNT(*)
FROM 
    pupil
WHERE marks > 30