Как рассчитать сумму группы в SQL? - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь найти способ вычисления нового столбца SQL, который работает по формуле, содержащей значения 'NA'. Я думаю, что я не получаю желаемый результат ни из-за значений 'NA', ни из-за моей группировки. См. Таблицу и формулу ниже:

Моя таблица выглядит следующим образом:

website session score
 google    1       1
 google    2       NA
 bbc       3       2
 bbc       4       4
 bbc       5       5

Формула, которую я использую для создания нового вычисляемого поля, выглядит следующим образом:

select
    website,
    (sum(score IN (4,5))/sum((score is not null)) - sum(score IN (1,2))/sum(score is not null))*100 as new_column
from 
    my_table
group by 
    website

По сути, формула пытается выполнить следующее:

Суммируйте те значения в столбце оценки, которые равны 4 или 5, а затем разделите их на сумму чисел в столбце оценки, которые действительно существуют. ,

Затем вычтите следующее:

Суммируйте те значения в столбце оценки, которые равны 1 или 2, а затем разделите их на сумму чисел в столбце оценки, которые существуют.

Наконец:

Умножьте весь вывод на 100

Формула должна быть применена к каждой группе.

Так что вы должны получить следующий желаемый результат:

Принимая только первую группу "Google"

У вас есть 4 ненулевые значения. у вас есть 2 значения, при этом значение IN (1,2) и 0 значений в (4,5).

, поэтому вы получите следующую формулу:

((0/4) - (2/4)) * 100

-2 / 4 * 100

= -50

однако при расчете этого значения в SQL я получаю значение -100. что не имеет смысла для меня. кто-нибудь может помочь?

Ответы [ 4 ]

2 голосов
/ 09 апреля 2020

У вас есть одно ненулевое значение для Google. Сумма этого одна. Таким образом, ваша формула приводит к (0-1 / 1) * 100, что составляет -100, то есть то, что она дает.

Я думаю, что вы хотите, чтобы количество всех записей Google делилось на количество все ненулевые записи?

0 голосов
/ 09 апреля 2020

Я думаю, вы ищете разницу между процентами (4,5) и (1,2) для каждой группы. Так как нулевые значения игнорируются при агрегации, вы можете просто сделать

(avg(score in (4,5)) - avg(score in (1,2)))*100
0 голосов
/ 09 апреля 2020

Я советую умножать на 1,0 каждую сумму, чтобы она не округляла сумму до значения int, что привело бы к нулю (0) для группы 'bb c'.

Вот обновленная версия вашего запроса (проверьте также SQL fiddle http://sqlfiddle.com/#! 5 / 5fca1 / 8 ):

select website,
    (sum(score IN (4,5)) * 1.0/sum(score is not null) - sum(score IN (1,2)) * 1.0/sum(score is not null))*100.0 as new_column
from my_table
group by website
0 голосов
/ 09 апреля 2020

Из вашего ручного примера вы можете сначала сложить все ненулевые значения, а затем использовать это значение в своем коде -

WITH NN_SUM AS (SELECT SUM(score is not null) NOT_NULL_SUM
                FROM my_table)
SELECT website,
       (((sum(score IN (4,5)) - sum(score IN (1,2))) / NOT_NULL_SUM) * 100 as new_column
FROM my_table
CROSS JOIN NN_SUM
GROUP BY website;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...