使用 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
:
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
学生可以通过或不通过测试。 总分 = 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
:
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