myCol
------
true
true
true
false
false
null
Dans le tableau ci-dessus, si je le fais:
select count(*), count(myCol);
Je reçois 6, 5
J'obtiens 5
car il ne compte pas l'entrée nulle.
Comment compter également le nombre de valeurs vraies (3 dans l'exemple)?
(Ceci est une simplification et j'utilise en fait une expression beaucoup plus compliquée dans la fonction de comptage)
Modifier le résumé: je souhaite également inclure un nombre brut (*) dans la requête, je ne peux donc pas utiliser de clause where
sql
postgresql
EoghanM
la source
la source
WHERE myCol = true
si vous le souhaitez et si vous supprimez le premier,*,
il renverra simplement le numéro.Réponses:
ou, comme vous l'avez découvert vous-même:
la source
ELSE null
pour obtenir le même résultat.Convertissez le booléen en entier et en somme.
Vous obtenez
6,3
.la source
Depuis PostgreSQL 9.4, il y a la
FILTER
clause , qui permet une requête très concise pour compter les vraies valeurs:La requête ci-dessus est un mauvais exemple dans la mesure où une simple clause WHERE suffirait, et sert uniquement à démontrer la syntaxe. Là où la clause FILTER brille, c'est qu'il est facile de la combiner avec d'autres agrégats:
La clause est particulièrement pratique pour les agrégats sur une colonne qui utilise une autre colonne comme prédicat, tout en permettant de récupérer des agrégats filtrés différemment dans une seule requête:
la source
probablement, la meilleure approche consiste à utiliser la fonction nullif.
en général
ou en bref
http://www.postgresql.org/docs/9.0/static/functions-conditional.html
la source
nullif([boolean expression], true)
retournerafalse
si [expression booléenne] est fausse, etnull
si elle est vraie, vous compterez donc les fausses valeurs. Je pense que tu veuxnullif([boolean expression], false)
.nullif([boolean expression], false)
fait en sorte qu'il soit beaucoup plus facile à lire. Vous pouvez ensuite faire varier la partie de l'expression booléenne pour qu'elle soit ce que vous voulez, dans ce casmyCol = true
pour compter les vraies valeurs, oumyCol = false
pour compter les fausses valeurs, ouname='john'
pour compter les personnes appelées john etc.La solution la plus courte et la plus paresseuse (sans coulée) serait d'utiliser la formule:
Essayez-le vous-même:
donne le même résultat que
la source
Dans MySQL, vous pouvez également le faire:
Je pense que dans Postgres, cela fonctionne:
ou mieux (pour éviter :: et utiliser la syntaxe SQL standard):
la source
Ou peut-être ceci
la source
myCol
expression est un booléen, vous pouvez remplacer la vérification parwhere (myCol)
Convertissez simplement le champ booléen en entier et faites une somme. Cela fonctionnera sur postgresql:
J'espère que cela pourra aider!
la source
Voici un moyen avec la fonction de fenêtrage:
la source
WHERE myCol = true
. J'ai fourni le deuxième exemple non pas parce qu'il est plus rapide, mais plutôt comme un élément pédagogique sur les fonctions de fenêtrage de Postgres, que de nombreux utilisateurs ne sont pas à l'aise ou ne connaissent pas.regroupera les 3 états possibles de bool (false, true, 0) en trois lignes particulièrement pratique lors du regroupement avec une autre colonne comme day
la source