postgresql – sql – nombre de valeurs `true`

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

Je reçois 5 car il ne compte pas l’entrée nulle.

Comment puis-je également compter le nombre de valeurs vraies (3 dans l’exemple)?

(Ceci est une simplification et j’utilise une expression beaucoup plus compliquée dans la fonction count)

Modifier le résumé: Je souhaite également inclure un nombre simple (*) dans la requête, donc je ne peux pas utiliser de clause where

 SELECT COALESCE(sum(CASE WHEN myCol THEN 1 ELSE 0 END),0) FROM 

ou, comme vous l’avez découvert par vous-même:

 SELECT count(CASE WHEN myCol THEN 1 END) FROM 

La meilleure approche consiste probablement à utiliser la fonction nullif.

en général

 select count(nullif(myCol = false, true)), -- count true values count(nullif(myCol = true, true)), -- count false values count(myCol); 

ou en bref

 select count(nullif(myCol, true)), -- count false values count(nullif(myCol, false)), -- count true values count(myCol); 

http://www.postgresql.org/docs/9.0/static/functions-conditional.html

Lance le booléen en un entier et sum.

 SELECT count(*),sum(myCol::int); 

Vous obtenez 6,3 .

Depuis PostgreSQL 9.4, il y a la clause FILTER , qui permet une requête très concise pour compter les vraies valeurs:

 select count(*) filter (where myCol) from tbl; 

La requête ci-dessus est un mauvais exemple en ce sens qu’une simple clause WHERE suffirait, et uniquement pour démontrer la syntaxe. Lorsque la clause FILTER brille, il est facile de combiner avec d’autres agrégats:

 select count(*), -- all count(myCol), -- non null count(*) filter (where myCol) -- true from tbl; 

La clause est particulièrement utile pour les agrégats sur une colonne qui utilise une autre colonne comme prédicat, tout en permettant d’extraire des agrégats filtrés différemment dans une seule requête:

 select count(*), sum(otherCol) filter (where myCol) from tbl; 

La solution la plus courte et la plus paresseuse (sans casting) serait d’utiliser la formule:

 SELECT COUNT(myCol OR NULL) FROM myTable; 

Essayez vous-même:

 SELECT COUNT(x < 7 OR NULL) FROM GENERATE_SERIES(0,10) t(x); 

donne le même résultat que

 SELECT SUM(CASE WHEN x < 7 THEN 1 ELSE 0 END) FROM GENERATE_SERIES(0,10) t(x); 
 select f1, CASE WHEN f1 = 't' THEN COUNT(*) WHEN f1 = 'f' THEN COUNT(*) END AS counts, (SELECT COUNT(*) FROM mytable) AS total_counts from mytable group by f1 

Ou peut-être cela

 SELECT SUM(CASE WHEN f1 = 't' THEN 1 END) AS t, SUM(CASE WHEN f1 = 'f' THEN 1 END) AS f, SUM(CASE WHEN f1 NOT IN ('t','f') OR f1 IS NULL THEN 1 END) AS others, SUM(CASE WHEN f1 IS NOT NULL OR f1 IS NULL THEN 1 ELSE 0 END) AS total_count FROM mytable; 

En MySQL, vous pouvez également le faire:

 SELECT count(*) AS total , sum(myCol) AS countTrue --yes, you can add TRUEs as TRUE=1 and FALSE=0 !! FROM yourTable ; 

Je pense que dans Postgres, cela fonctionne:

 SELECT count(*) AS total , sum(myCol::int) AS countTrue --convert Boolean to Integer FROM yourTable ; 

ou mieux (pour éviter :: et utiliser la syntaxe SQL standard):

 SELECT count(*) AS total , sum(CAST(myCol AS int)) AS countTrue --convert Boolean to Integer FROM yourTable ; 

Convertissez simplement le champ booléen en entier et faites une sum. Cela fonctionnera sur postgresql:

 select sum(myCol::int) from 

J’espère que cela pourra aider!

 SELECT count(*) -- or count(myCol) FROM  -- replace 
with your table WHERE myCol = true;

Voici un moyen avec la fonction de fenêtrage:

 SELECT DISTINCT *, count(*) over(partition by myCol) FROM ; -- Outputs: -- -------------- -- myCol | count -- ------+------- -- f | 2 -- t | 3 -- | 1