Je construis une requête avec une GROUP BY
clause qui a besoin de la capacité de compter les enregistrements basés uniquement sur une certaine condition (par exemple, ne comptez que les enregistrements où une certaine valeur de colonne est égale à 1).
SELECT UID,
COUNT(UID) AS TotalRecords,
SUM(ContractDollars) AS ContractDollars,
(COUNTIF(MyColumn, 1) / COUNT(UID) * 100) -- Get the average of all records that are 1
FROM dbo.AD_CurrentView
GROUP BY UID
HAVING SUM(ContractDollars) >= 500000
La COUNTIF()
ligne échoue évidemment car il n'y a pas de fonction SQL native appelée COUNTIF
, mais l'idée ici est de déterminer le pourcentage de toutes les lignes qui ont la valeur «1» pour MyColumn.
Des idées sur la façon de mettre en œuvre correctement cela dans un environnement MS SQL 2005?
la source
ISNULL
, à la place, vous pouvez le faireCASE WHEN myColumn IS NULL
ou utiliserifnull
( stackoverflow.com/a/799406/1861346 )Je fais généralement ce que Josh a recommandé, mais j'ai réfléchi et testé une alternative légèrement hokey que j'avais envie de partager.
Vous pouvez profiter du fait que COUNT (ColumnName) ne compte pas les NULL et utiliser quelque chose comme ceci:
NULLIF - renvoie NULL si les deux valeurs transmises sont identiques.
Avantage: exprime votre intention de COUNT lignes au lieu d'avoir la notation SUM (). Inconvénient: son fonctionnement n'est pas aussi clair (la «magie» est généralement mauvaise).
la source
ISNULL
comme suit:SELECT COUNT(NULLIF(0, ISNULL(myColumn, 0)))
. Attendez, ça a l'air moche ...J'utiliserais cette syntaxe. Il atteint la même chose que les suggestions de Josh et Chris, mais avec l'avantage qu'il est conforme à ANSI et n'est pas lié à un fournisseur de base de données particulier.
la source
NULLIF
est inclus Standard SQL-92). La réponse de Josh peut être facilement transformée en SQL standard en remplaçantisnull
parCOALESCE
.=
. Je l'utilise pour "compter le nombre de réponses> = 2".En plus de la réponse de Josh,
Cela a bien fonctionné pour moi (dans SQL Server 2012) sans changer le «nombre» en «somme» et la même logique est transférable à d'autres «agrégats conditionnels». Par exemple, sommation basée sur une condition:
la source
Que diriez-vous
Plus court que
CASE
:)Fonctionne car
COUNT()
ne compte pas les valeurs nulles etIF
/CASE
renvoie null lorsque la condition n'est pas remplie et qu'il n'y en a pasELSE
.Je pense que c'est mieux que d'utiliser
SUM()
.la source
Pas spécifique au produit, mais le standard SQL fournit
SELECT COUNT() FILTER WHERE <condition-1>, COUNT() FILTER WHERE <condition-2>, ... FROM ...
dans ce but. Ou quelque chose qui lui ressemble beaucoup, je ne sais pas de haut en bas de mon chapeau.
Et bien sûr, les fournisseurs préféreront s'en tenir à leurs solutions propriétaires.
la source
FILTER
clause est PostgreSQL, mais il est émulé parCASE
tous.Pourquoi pas comme ça?
la source
J'ai dû utiliser COUNTIF () dans mon cas dans le cadre de mes colonnes SELECT ET pour imiter un% du nombre de fois où chaque élément est apparu dans mes résultats.
Alors j'ai utilisé ça ...
Bien sûr, vous devrez formater le résultat en fonction de vos besoins d'affichage.
la source
la source