Как рассчитать итоговую итоговую сумму и рассчитать проценты - PullRequest
0 голосов
/ 18 сентября 2018

Ниже у меня есть запрос, где у меня есть общий 1-й язык, на котором говорят студенты на каждом языке

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

Теперь у меня есть 1 основная проблема, которая заключается в назначении ОБЩЕЙ СУММЫ значения для студентов. Мне это нужно, чтобы я мог вычислить процент из числа студентов / всего студентов в столбце. Однако, очевидно, моя общая стоимость не дает мне то, что мне нужно.

выход

    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

Как рассчитать итоговую итоговую сумму как значение для расчета процентов

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

вы можете попробовать как ниже

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
0 голосов
/ 18 сентября 2018

демо: дб <> скрипка

Вы можете использовать оконные функции (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).

...