7 votes

Comptes pour de nombreux champs booléens dans une seule requête SQL?

Je ne suis pas sûr exactement comment expliquer ça, mais imaginez que vous avez une table avec beaucoup de champs booléens comme ceci...

Tableau : Voitures

Colonnes :

Automatique : booléen

Argent : booléen

Américain : booléen

Bruyant : booléen

Malodorant : booléen

Rapide : booléen

(champs ridicules et la plupart d'entre eux ne seraient pas des booléens en réalité mais c'est juste un exemple)

Ce que j'ai besoin de faire, c'est de produire une liste de ces champs avec un nombre de résultats de recherche à côté de chacun, donc s'il y avait 100 voitures argentées dans la base de données et 57 voitures américaines, la liste pourrait ressembler un peu à ceci...

Automatique : (150)

Argent (100)

Américain (57)

Bruyant (120)

Malodorant (124)

Rapide (45)

Donc, c'est fondamentalement comme une liste de filtres, si l'utilisateur clique sur "argent", il va réduire la recherche pour montrer uniquement les voitures argentées et il saura qu'il obtiendra 100 résultats. Les chiffres à côté de tous les autres filtres diminueront ensuite car nous avons filtré toutes les voitures qui ne sont pas argentées.

Compter les occurrences d'un champ serait facile...

SELECT COUNT(*) FROM VOITURES WHERE Automatique = vrai;

... me donnerait la première ligne par exemple. Mais je ne veux pas avoir à faire une seule instruction SQL pour chaque filtre car il pourrait y en avoir plus de 30. J'ai vu beaucoup de sites le faire donc ça doit être plus facile que ce que je pense.

Toute aide serait vraiment appréciée :)

Jon

12voto

SubPortal Points 1016

Avec SQL Server 2008 lorsqu'on essaie de sommer un champ de type de données bit l'erreur suivante se produit :

Msg 8117, Niveau 16, État 1, Ligne 10

Le type de données d'opérande bit est invalide pour l'opérateur de somme.

vous pouvez essayer ceci :

SELECT SUM(CAST(Automatic AS TINYINT)) as Automatic, SUM(CAST(Smelly AS TINYINT)) as Smelly, SUM(CAST(American AS TINYINT)) as Japanese FROM YourTable

6voto

Remus Rusanu Points 159382

En supposant que le bit soit 1/0 alors vous pouvez faire la SUM au lieu du COUNT :

SELECT SUM(Automatic) as Automatic, SUM(Smelly) as Smelly, SUM(American) as Japanese FROM ...

4voto

Charles Bretana Points 59899

Si ce n'est pas déjà 1/0, alors, en fonction de ce que vaut la vraie valeur, vous pouvez faire ceci:

  Sélectionner
     Somme(Cas Quand Automatic = truevalue Alors 1 Sinon 0 Fin) comme Automatic,
     Somme(Cas Quand Smelly = truevalue Alors 1 Sinon 0 Fin) comme Smelly,
     Somme(Cas Quand American = truevalue Alors 1 Sinon 0 Fin) comme American,
     Somme(Cas Quand Noisy = truevalue Alors 1 Sinon 0 Fin) comme Noisy
  Depuis Table

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X