Попытка получить процент от общего числа в качестве поля - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь получить процент от общего количества записей в дополнение к количеству каждой группировки.

Например, у меня есть запрос ниже, где я получаю количество всех записей, которые квалифицируются как "затронутые", и те, которые не были.

Затем я хочу получить процент целого по этим подсчетам (если «затронуты» записи 40/50, то он должен показывать 80%)

N / A

SELECT COUNT(Contact) AS [COUNT],
       (CASE WHEN number>=1 THEN 'Touched' ELSE 'Not Touched' END) AS TOUCHED
FROM Events
GROUP BY (CASE WHEN number>=1 THEN 'Touched' ELSE 'Not Touched' END)

Count    TOUCHED
604      Not Touched
213      Touched

Там должен быть дополнительный столбец с процентом, показывающим 73,92% для "Не тронут" и 26,07% для "Тронут"

Ответы [ 4 ]

1 голос
/ 13 мая 2019

COUNT() * 100 / SUM() вернет процент:

SELECT COUNT(Contact) AS COUNT,
    (CASE WHEN number >= 1 THEN 'Touched' ELSE 'Not Touched' END) AS TOUCHED,
    (COUNT(Contact) * 100 / SUM(Contact)) AS PERCENT
FROM Events
GROUP BY (CASE WHEN number >= 1 THEN 'Touched' ELSE 'Not Touched' END)
0 голосов
/ 13 мая 2019

Данная версия заменяет метки в исходном запросе с именами столбцов вместо этого.Если вам нужны встроенные метки, изменения должны быть простыми:

SELECT 
    Touched,
    Cast(Touched/Cast(Total as decimal(9,2)) * 100.0 as Decimal(5,2)) as TouchedPct,
    Total - Touched as [Not Touched],
    Cast((Total - Touched)/Cast(Total as decimal(9,0)) * 100.0 as Decimal(5,2)) as NotTouchedPct
FROM (
    SELECT 
        SUM(CASE WHEN number >= 1 then 1 else 0 END) as Touched,
        Count(*) as Total
    FROM Events
    ) src

Обратите внимание, что если number никогда не может быть отрицательным, тогда вычисление Touched можно изменить на

SUM(SIGN(number)) as Touched,
0 голосов
/ 13 мая 2019

Просто оберните его чем-то вроде:

Select ([Touched]/[Not touched])*100
From (
Your code

)

Это также можно сделать, вставив его в временную таблицу и выполнив то же самое с колонками.

Возможно, вам придетсяприведение / преобразование [касание] в десятичное число.

0 голосов
/ 13 мая 2019

Это должно дать вам то, что вы ищете:

SELECT COUNT(Contact) AS [COUNT],
       (COUNT(Contact) * 1.0) / COUNT(Contact) OVER () AS Perc,
       CASE WHEN number>=1 THEN 'Touched' ELSE 'Not Touched' END AS TOUCHED
FROM Events
GROUP BY CASE WHEN number>=1 THEN 'Touched' ELSE 'Not Touched' END;

Вы можете использовать Окно, чтобы получить общее количество за пределами группы, и уменьшить количество по нему.

...