2009-12-29 20 views
1

我想要得到一個顯示Uniuque「Reasons」的結果,它們的數量以及它們總數的百分比。到目前爲止,我有在SQL中有一列的結果的百分比

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

但是,正如我發現COUNT(*)和COUNT(原因)給出相同的結果。所以我的基本問題是,當我在查詢中使用distinct時,如何獲得總行數? 我正在使用SQL Server 2005

+1

的SQL供應商 – 2009-12-29 22:49:09

回答

4
SELECT Reason, 
     COUNT(Reason) AS Number, 
     CAST(COUNT(Reason) AS float)/CAST(t.Total AS float) AS percentage 
FROM DeletedClients, 
    (SELECT COUNT(*) As Total FROM DeletedClients) t 
GROUP BY Reason, Total 
0
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特定的方式進行了投射,但您可以根據自己的需要進行調整。你需要使用group by。我剛好因爲我喜歡它添加的順序:P

0

我認爲你應該使用group by:


SELECT Reason, 
     COUNT(Reason) AS Number, 
     CAST(COUNT(Reason) AS float)/CAST(COUNT(*) AS float) AS percentage 
FROM DeletedClients 
GROUP BY Reason 
+1

這導致1所有行(SQL Server)的 – 2009-12-29 23:11:24

+0

你是對的百分比我的壞 – 2009-12-29 23:26:29

1

用途:

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 
+0

這給0,以百分比的所有行。 – 2009-12-29 23:12:39

+0

@Brian:正確 - 整數數學。 – 2009-12-30 02:10:03

0

您的查詢會出現問題,因爲它是。如果你想返回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