【问题标题】:How to calculate the Final Total sum and calculate percentages如何计算最终总和并计算百分比
【发布时间】:2019-02-22 07:35:31
【问题描述】:

下面我有一个查询,其中我有学生使用每种语言的总第一语言

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

如何计算最终总和作为计算百分比的值

【问题讨论】:

    标签: sql postgresql percentage postgresql-9.3


    【解决方案1】:

    demo:db<>fiddle

    您可以使用窗口函数 (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) 所必需的。

    【讨论】:

    • 我的问题是正确计算总值。我需要一个变量来保存学生总数
    • SUM(students) OVER () 做到了
    【解决方案2】:

    你可以试试下面的

    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
    

    【讨论】:

    • 你的部门不需要添加小数转换吗?否则它将是一个整数除法,不是吗?
    猜你喜欢
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 2019-01-26
    • 2018-04-19
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    相关资源
    最近更新 更多