2009-12-29 10 views
1

J'essaie d'obtenir un résultat qui montrera Uniuque "Raisons", le nombre d'entre eux, et le pourcentage du total qu'ils sont. jusqu'à présent j'aiPourcentage de résultats qui ont une colonne dans SQL

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

Cependant, comme j'ai découvert COUNT (*) et COUNT (Reason) donnent le même résultat. Donc, ma question fondamentale est, comment puis-je obtenir le nombre total de lignes lorsque j'utilise distinct dans la requête? J'utilise SQL Server 2005

+1

quel fournisseur sql –

Répondre

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; 

C'est ce que je suis venu avec. J'ai fait le casting d'une manière spécifique postgresql mais vous pouvez ajuster cela pour vos besoins. Vous devez utiliser le groupe par. J'ai ajouté l'ordre par juste parce que je l'ai aimé: P

0

Je pense que vous devriez utiliser groupe par:


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

Il en résulte un pourcentage de 1 pour toutes les lignes (SQL Server) –

+0

Vous avez raison de mon mauvais –

1

Utilisation:

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

Cela donne 0 le pourcentage pour toutes les lignes –

+0

@Brian: Correct - maths entières Corrigé. –

0

Votre requête aura des problèmes car il est. En ce qui concerne l'objectif, COUNT (et d'autres agrégats) ignorent les valeurs nulles (si vous utilisez au moins SQL Server), de sorte que cette option ne contient aucun groupe (dont vous avez besoin si vous voulez retourner la colonne Reason). devrait fonctionner:..

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