Процент результатов со столбцом в SQL

Я пытаюсь получить результаты, которые покажут Uniuque «Причины», их количество и процент от общего числа. до сих пор у меня есть

SELECT DISTINCT Reason, 
       COUNT(Reason) AS Number, 
       CAST(COUNT(Reason) AS float) / CAST(COUNT(*) AS float) AS percentage
FROM DeletedClients

Однако, как я обнаружил, COUNT(*) и COUNT(Reason) дают один и тот же результат. Итак, мой основной вопрос: как получить общее количество строк, когда я использую разные в запросе? Я использую SQL Server 2005


person Scott Chamberlain    schedule 29.12.2009    source источник


Ответы (4)


Использовать:

SELECT x.reason,
       x.num AS NUMBER,
       CONVERT(x.num, float)/(SELECT CONVERT(COUNT(*), float) FROM DELETEDCLIENTS) AS PERCENTAGE
  FROM (SELECT t.reason,
               COUNT(*) 'num'
          FROM DELETEDCLIENTS t
      GROUP BY t.reason) x
person OMG Ponies    schedule 29.12.2009
comment
Это дает 0 в качестве процента для всех строк. - person Brian Schantz; 30.12.2009
comment
@Brian: Правильно - целочисленная математика. Исправлено. - person OMG Ponies; 30.12.2009

select reason, count(reason), 
       (count(reason)::float / (select count(reason) from reasons)::float) * 100 
       as percent 
from DeletedClients group by reason order by reason;

Это то, что я придумал. Я сделал приведение в соответствии с postgresql, но вы можете настроить его для своих нужд. Вам нужно использовать группу. Я добавил заказ только потому, что он мне понравился :P

person Arthur Thomas    schedule 29.12.2009

Я думаю, вы должны использовать group by:


SELECT Reason, 
       COUNT(Reason) AS Number, 
       CAST(COUNT(Reason) AS float) / CAST(COUNT(*) AS float) AS percentage
FROM DeletedClients
GROUP BY Reason
person Y. Shoham    schedule 29.12.2009
comment
Это приводит к проценту 1 для всех строк (SQL Server). - person Brian Schantz; 30.12.2009

Ваш запрос будет иметь проблемы, как это. Нет группы по (которая вам нужна, если вы хотите вернуть столбец Reason.

Что касается цели, COUNT (и другие агрегаты) игнорируют нули (по крайней мере, если вы используете SQL Server), поэтому это должно работать:

DECLARE @TOTAL FLOAT
SELECT @TOTAL = COUNT(1)
FROM DeletedClients

SELECT DISTINCT
    Reason,
    Cnt AS Number,
    @TOTAL AS TotalRecords,
    CAST(Cnt AS float) / @TOTAL AS percentage
FROM (
    SELECT
        Reason,
        COUNT(*) AS Cnt
    FROM DeletedClients
    GROUP BY Reason
) t
GROUP BY
    Reason,
    Cnt
person Gabriel McAdams    schedule 29.12.2009