下面我有一个查询,我用每种语言的学生说的第一语言总数
CTE
WITH Lang AS
(
SELECT
language,
studentcount,
SUM(Studentcount) AS total
FROM
(SELECT
l.longtext AS language,
COUNT(distinct s.studentnr) AS Studentcount
FROM
student s
JOIN
pupil p on p.id = s.pupilid
JOIN
pupillanguage pl on pl.personid = p.id
JOIN
language l on l.id = pl.languageid
GROUP BY
l.longtext
ORDER BY
Studentcount DESC
) t
GROUP BY
language, Studentcount
)
询问
SELECT initcap(language), Studentcount, total
FROM Lang
UNION ALL
SELECT cast(count(language) as varchar(6)) ||' Languages', null, null
FROM Lang
现在我有一个主要问题是分配学生的总和值。我需要这个,所以我可以计算一列中学生人数/学生总数的百分比。但显然我的总价值并不能满足我的需求。
产量
languages students total
------------------------------
French 734 734
Afrikaans 93 93
Greek 117 117
German 55 55
Armenian 160 160
Malaysian 5 5
Danish 15 15
American 5 5
Swedish 24 24
Bulgarian 1043 1043
预期产量:
languages students Percentage
-----------------------------------
French 734 24,46
Afrikaans 93 3,12
Greek 117 3,9
German 55 1,83
Armenian 160 5,33
Malaysian 5 0,16
Danish 15 0,5
American 5 0,16
Swedish 24 0,8
Bulgarian 1043 34,76
如何计算最终总和作为计算百分比的值
你可以使用窗口函数(https://www.postgresql.org/docs/current/static/tutorial-window.html):
SELECT
language,
students,
SUM(students) OVER () as total,
students::decimal / SUM(students) OVER () * 100 as percentage
FROM
--- <YOUR QUERY>
窗口函数SUM(students) OVER ()
汇总了学生列的所有值,因为OVER
子句中没有给出限制框架
::decimal
强制转换是获得浮动除法(100/200 = 0.5)而不是整数除法(100/200 = 0)所必需的。
你可以尝试如下
with t1 as (
SELECT l.longtext as language,
count(distinct s.studentnr) as Studentcount
FROM student s
join pupil p on p.id = s.pupilid
join pupillanguage pl on pl.personid = p.id
join language l on l.id = pl.languageid
group by l.longtext
order by Studentcount desc
) select language,Studentcount, sum(Studentcount) over() as total,
(Studentcount::float/sum(Studentcount) over())*100 as percentage
from t1