IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

REQUETE AVEC 2 COUNT AVEC 1 CONDITION POUR CHAQUE COUNT


Sujet :

MS SQL Server

  1. #1
    Membre confirmé
    Homme Profil pro
    Médecin Département d'Information Médicale (DIM)
    Inscrit en
    Janvier 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Médecin Département d'Information Médicale (DIM)
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2009
    Messages : 115
    Par défaut REQUETE AVEC 2 COUNT AVEC 1 CONDITION POUR CHAQUE COUNT
    Bonjour

    Est-il possible de faire une requête avec 2 COUNT, avec pour chaque COUNT une condition (dénommée X et Y dans l'exemple ci-dessous), le tout en une seule requête:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT COUNT(MATABLE.MACOLONNE1)
    FROM MATABLE
    WHERE MATABLE.MACOLONNE1 IN 
    (SELECT MACOLONNE
    FROM MATABLE
    WHERE MATABLE.MACOLONNE_N = CONDITION_X),
    SELECT COUNT(MATABLE.MACOLONNE1)
    FROM MATABLE
    WHERE MATABLE.MACOLONNE1 IN 
    (SELECT MACOLONNE
    FROM MATABLE
    WHERE MATABLE.MACOLONNE_N = CONDITION_Y)

    Evidemment cela ne marche pas, mais est-ce un problème de syntaxe (j'obtiens:
    Serveur*: Msg 102, Niveau 15, État 1, Ligne 6
    Syntaxe incorrecte vers ','.) ou tout simplement ce n'est pas possible

    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 29
    Par défaut
    Bonjour.

    Si j'ai bien compris, tu essayes d'obtenir en 1 ligne, des COUNT provenant de deux requêtes différentes.
    Il faut donc que tu procèdes en deux étapes et que tu récupères le tout après.

    Dans ton cas, cela donne :

    SELECT * FROM
    (
    SELECT COUNT(MATABLE.MACOLONNE1) AS cpt1
    FROM MATABLE
    WHERE MATABLE.MACOLONNE_N1 = <<condition1>>
    ) tb1
    ,
    (
    SELECT COUNT(MATABLE.MACOLONNE1) AS cpt2
    FROM MATABLE
    WHERE MATABLE.MACOLONNE_N2 = <<condition2>>
    ) tb2

    Tu constateras que j'ai retiré ton WHERE .. IN qui est est très gourmand en temps et qui (dans le cas présent, même nom de table) n'apporte rien.

    Cordialement.

  3. #3
    Membre confirmé
    Homme Profil pro
    Médecin Département d'Information Médicale (DIM)
    Inscrit en
    Janvier 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Médecin Département d'Information Médicale (DIM)
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2009
    Messages : 115
    Par défaut
    Merci beaucoup, c'est exactement ce que je voulais

  4. #4
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Ou alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT SUM(CASE WHEN MATABLE.MACOLONNE_N1 = <<condition1>> THEN 1 ELSE 0 END) AS cpt1
    , SUM(CASE WHEN MATABLE.MACOLONNE_N2 = <<condition2>> THEN 1 ELSE 0 END) AS cpt2
    FROM MATABLE

  5. #5
    Membre confirmé
    Homme Profil pro
    Médecin Département d'Information Médicale (DIM)
    Inscrit en
    Janvier 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Médecin Département d'Information Médicale (DIM)
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2009
    Messages : 115
    Par défaut
    Pas mal et plus court encore!

    Merci beaucoup

  6. #6
    Membre confirmé
    Homme Profil pro
    Médecin Département d'Information Médicale (DIM)
    Inscrit en
    Janvier 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Médecin Département d'Information Médicale (DIM)
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2009
    Messages : 115
    Par défaut DISTINCT
    Je m'aperçois en fait que j'ai besoin -aprés avoir enrichi ma requête- de l'équivalent de COUNT (DISTINCT xxx) plutôt que de COUNT (xxx)

    Où insère t'on un DISTINCT dans la requête de Rei Ichido?

    (Dans la requête de beretb c'est buien sûr évident)

    Merci

  7. #7
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Citation Envoyé par Dr_No Voir le message
    Je m'aperçois en fait que j'ai besoin -aprés avoir enrichi ma requête- de l'équivalent de COUNT (DISTINCT xxx) plutôt que de COUNT (xxx)

    Où insère t'on un DISTINCT dans la requête de Rei Ichido?
    C'est possible, mais ça pose pas mal de problèmes.

    Je vais te montrer un exemple avant de te parler des limitations.

    Tu pourrais faire quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    SELECT 
    	COUNT(
    		DISTINCT 
    			CASE WHEN <Condition1> THEN <Colonne1>
    			ELSE NULL
    			END
    		)
    		AS <Alias1>,
     
    	COUNT(
    		DISTINCT 
    			CASE WHEN <Condition2> THEN <Colonne2>
    			ELSE NULL
    			END
    		)
    		AS <Alias2>
    FROM <TaTable>
    Ça te retourne bien le résultat, mais avec des limitations:

    1. comme tu as certainement des enregistrements qui ne répondent pas aux conditions, SQL Server va t'afficher le warning suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: Null value is eliminated by an aggregate or other SET operation.
    2. c'est pas vraiment une solution très "naturelle" pour quiconque doit maintenir la requête

    3. au niveau des performances, c'est pas terrible:

    En effet, si tu fais 2 requêtes séparées, SQL Server peut éventuellement se servir des index présents dans la base, alors que dans l'exemple précédent ce n'est pas possible et les expressions sont évaluées pour TOUS les enregistrement de ta table avant de faire des aggrégats (pour résumer, au lieu d'avoir 2 sous-requêtes rapides et optimisées, t'as une requête lente)

    Pour vérifier l'impact sur les performances sur un échantillon de données, c'est très simple:
    1. tu implémentes la solution précédente
    2. dans le même script tu implémentes la solution de beretb
    3. tu regardes le plan d'exécution de l'ensemble de ton script (surtout les pourcentages de chaque requête du script)


    À mon avis, il y a de fortes chances que la solution de beretb (avec des DISTINCT en plus) soit meilleure.


    Voilà, j'espère avoir été suffisamment clair et avoir fait le tour des limitations.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  8. #8
    Membre confirmé
    Homme Profil pro
    Médecin Département d'Information Médicale (DIM)
    Inscrit en
    Janvier 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Médecin Département d'Information Médicale (DIM)
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2009
    Messages : 115
    Par défaut
    Merci pour cette réponse

    Je présentais bien que si une solution existait, elle serait coûteuse en performance

    J'ai cependant trouvé une solution probalement coûteuse aussi mais qui fonctionne bien parce qu'en fait, ma requête type est simplifiée mais la vraie a des jointure etc.

    J'arrive à une solution en écrivant:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    REQUETE DE REI ICHIDO
    et après le je rajoute:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE MONIDENTIFIANT = (SELECT DISTINCT xxx FROM TABLEX WHERE etc...)

  9. #9
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    S'il y a des DISTINCT, il vaudrait probablement mieux passer par la requête des count(DISTINCT), en plaçant un index sur chacune des deux colonnes identifiées ça devrait aller très vite.
    Mais il vaudrait mieux voir la requête complète pour se prononcer !

  10. #10
    Membre confirmé
    Homme Profil pro
    Médecin Département d'Information Médicale (DIM)
    Inscrit en
    Janvier 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Médecin Département d'Information Médicale (DIM)
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2009
    Messages : 115
    Par défaut
    Rei Ichido, Je me permets de mettre ma requêt en PJ

    Merci beaucoup


    Cordialement
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/04/2015, 15h44
  2. Réponses: 0
    Dernier message: 23/06/2011, 12h28
  3. Erreur SQl pour select count avec critere date
    Par fdalyon dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 10/05/2010, 20h50
  4. [SQL] Recherche SQL avec la correspondance de la TVA pour chaque pays
    Par bb62 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/04/2008, 16h53
  5. Réponses: 3
    Dernier message: 18/11/2006, 21h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo