Forum Programmation.autre Compter des lignes en sql.

Posté par  .
Étiquettes :
0
18
mai
2005
Hello !
Voici mon problème du jour. Je voudrais, en une seule instruction select, obtenir plusieurs comptes. L'idée générale, serait d'obtenir des parties du tout.
Quelque chose qui ressemblerait à ça :
select
count(champ = valeur1),
count(champ = valeur2),
count(*)
from
table
where
filtre in (valeurA, valeurB);

Evidement, ce que je poste ci-dessus ne fonctionne pas. Ou plutôt, si, ça fonctionne, car c'est syntaxiquement correct, mais les 3 valeurs retournées sont les mêmes : c'est celle du count(*).
Savez-vous comment je peux procéder ?
Je suis sous postgreSQL, et la table compte 55 000 enregistrements. Alors les alias, si je pouvais m'en passer.... Je ne vous fait pas de dessin. D'autant plus que là, ce n'est qu'une ébauche, mais il me faudra d'autres informations qui seront utilisées dans le group by final.
Par avance merci pour vos suggestions.
  • # coin coin

    Posté par  . Évalué à -9.

    pan ! pan !

    dabowl_75

  • # sum

    Posté par  . Évalué à 7.

    select

    sum(decode(champ, valeur1, 1, 0)),

    sum(decode(champ, valeur2, 1, 0)),

    count(0)

    from

    table

    where

    filtre in (valeurA, valeurB);


    c'est du code oracle mais je pense qu' la fonction decode existe ou a un equivalent sur postgreSQL

    Dam
  • # Hum ...

    Posté par  . Évalué à 6.

    Et découper ça en plusieurs requêtes plus simples ?
    Peut-être utiliser les procédures stockées pour mémoriser des valeurs ?
    Des fois, c'est tout aussi simple.
    • [^] # Re: Hum ...

      Posté par  . Évalué à 2.

      Milles excuses, un clic malheureux m'a fait "inutiliser" ton post contre mon grès...
      Prend ce post pour un doublepertinentage pour rattraper mon erreur !
    • [^] # Re: Hum ...

      Posté par  . Évalué à 1.

      En effet, il suffit que "champ" soit indexé (et "filtre" aussi pendant qu'on y est), et un assemblage de sous-requêtes serait toujours *extrêmement* plus performant que des "case" en fonction d'agrégat (qui obligent le balayage complet de la table, et autant d'addition inutile +0, sans la moindre rentabilisation possible d'un index)

      Dailleurs, J'me demande même si sans index sur "champ", une décomposition n'en serait quand même que plus rapide qu'avec les "case" (je ne connais pas suffisement postgreSQL pour l'affirmé) (un filtre est toujours plus rapide qu'une évaluation (surtout imbriqué dans un agrégat), mais le nombre de balayage de la table passe du simple au triple, benchmark interressant à faire)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.