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

Langage SQL Discussion :

Deux requêtes en une ?


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    Points : 65
    Points
    65
    Par défaut Deux requêtes en une ?
    Bonjour !

    J'ai deux requêtes avec un COUNT chacune. Or, j'aimerais les mettre en une seule requête afin d'avoir un seul total.

    Voici mes requêtes. La première retourne le nombre de fiches "d'info complémentaires clients" dont il manque le fax.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT COUNT(*)
    FROM cli_info
    WHERE (cli_info.fax IS NULL OR cli_info.fax="")
    La deuxième retourne le nombre de fiches "d'info complémentaires clients" qui n'existent pas. (Dans la base, il existe une table client avec les info principales et une table avec les info complémentaires. La fiche "client" existe toujours alors que la fiche "info complémentaire client" n'est pas toujours créée).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT COUNT(no_cli)
    FROM client
    WHERE NOT EXISTS
    (SELECT no_cli
    FROM cli_info
    WHERE cli_info.no_cli = client.no_cli)
    Voilà, j'aimerais sortir un seul COUNT, donc une seule requête. Est-ce possible ?

    Merci d'avance !

  2. #2
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Quel est le but de l'opération ?

    Si vous voulez simplement afficher le résultat en un seul select, autant faire un UNION ALL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT 'Fax non renseigne' AS Nature, COUNT(*) AS Nb
    FROM cli_info
    WHERE (cli_info.fax IS NULL OR cli_info.fax="")
     
    UNION ALL
     
    SELECT  'Info complémentaire manquante' AS Nature, COUNT(no_cli) AS Nb
    FROM client
    WHERE NOT EXISTS
    (SELECT no_cli
    FROM cli_info
    WHERE cli_info.no_cli = client.no_cli)
    Si le but est de faire de la performance, je ne vois pas trop, la table principale n'est pas la même dans les deux cas, on peut potentiellement s'épargner un parcours de cli_info mais sans que cela soit intéressant à mon sens (il sera plus performant d'utiliser le UNION ALL si les tables sont bien indexées).

  3. #3
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    Points : 65
    Points
    65
    Par défaut
    Effectivement, c'est pour avoir un résultat par une seule requête à cause d'une contrainte sur un logiciel.

    Merci pour le tuyau, ça marche impec et ça m'enlève une belle épine du pied !

  4. #4
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    Points : 65
    Points
    65
    Par défaut
    Je me suis peut-être un peu enflammée. En fait, il me retourne deux résultats, un pour chaque requête, c'est bien ça ? J'aimerais que les deux résultats soient cumulés c'est possible ? De façon à obtenir un total des deux requêtes.

    Merci !

  5. #5
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Cumulés, c'est à dire faire la somme des deux ?

    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
    18
     
    WITH details AS
    (
    SELECT 'Fax non renseigne' AS Nature, COUNT(*) AS Nb
    FROM cli_info
    WHERE (cli_info.fax IS NULL OR cli_info.fax="")
     
    UNION ALL
     
    SELECT  'Info complémentaire manquante' AS Nature, COUNT(no_cli) AS Nb
    FROM client
    WHERE NOT EXISTS
    (SELECT no_cli
    FROM cli_info
    WHERE cli_info.no_cli = client.no_cli)
    )
    SELECT sum(nb) as total
    FROM Details

  6. #6
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    Points : 65
    Points
    65
    Par défaut
    Oui, c'est bien ça, je voudrais retourner la somme des deux comme valeur.

    Quand je fais la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT COUNT(*) AS Nb
    FROM cli_info
    WHERE (cli_info.fax IS NULL OR cli_info.fax="")
     
    UNION ALL
     
    SELECT COUNT(no_cli) AS Nb
    FROM client
    WHERE NOT EXISTS
    (SELECT no_cli
    FROM cli_info
    WHERE cli_info.no_cli = client.no_cli)
    J'obtiens les valeurs qui s'affichent :
    15
    225

    Je voudrais que ce soit le cumul des deux qui soit retourné. J'ai essayé ta requête, sous la forme suivante :

    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
    18
     
    WITH details AS 
    (
    SELECT COUNT(*) AS Nb
    FROM cli_info
    WHERE (cli_info.fax IS NULL OR cli_info.fax="")
     
    UNION ALL
     
    SELECT COUNT(no_cli) AS Nb
    FROM client
    WHERE NOT EXISTS
    (SELECT no_cli
    FROM cli_info
    WHERE cli_info.no_cli = client.no_cli)
    )
    SELECT sum(Nb)
    FROM details
    Mais j'obtiens un message d'erreur :
    Syntax Error.

    Ma base est sous Informix.

  7. #7
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Je ne connais pas les spécificités Informix ...

    Essayons ceci :

    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 sum(nb) AS total
    FROM (
    SELECT COUNT(*) AS Nb
    FROM cli_info
    WHERE (cli_info.fax IS NULL OR cli_info.fax="")
     
    UNION ALL
     
    SELECT COUNT(no_cli) AS Nb
    FROM client
    WHERE NOT EXISTS
    (SELECT no_cli
    FROM cli_info
    WHERE cli_info.no_cli = client.no_cli)
            ) t

  8. #8
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    Points : 65
    Points
    65
    Par défaut
    Roh trop bien, ça maaaaaaaaaaarche ! C'est trop beau ! Merci merci merci !

  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    EDIT : suite à la pertinente remarque de ReiIchido... les requetes ci-dessous sont fausses...

    Une première remarque : vous allez compter deux fois les clients qui n'ont ni fax, ni info complémentaires... est-ce voulu ?
    Dans ce cas, vous pouvez aussi essayer cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT
        SUM(
            CASE WHEN C.fax IS NULL OR C.fax="" THEN 1 ELSE 0 END
            +
            CASE WHEN CI.no_cli IS NULL THEN 1 ELSE 0 END
        ) as total
    FROM client C
    LEFT OUTER JOIN cli_info CI
        ON CI.no_cli  = C.no_cli
    Si vous ne voulez compter qu'une seule fois les clients qui n'ont ni fax ni info complémentaire, il y a même encore plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT
        COUNT(
            CASE WHEN 
                     C.fax IS NULL 
                OR   C.fax=""
                OR   CI.no_cli IS NULL
              THEN 1 
            END
        ) as total
    FROM client C
    LEFT OUTER JOIN cli_info CI
        ON CI.no_cli  = C.no_cli

  10. #10
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    Une première remarque : vous allez compter deux fois les clients qui n'ont ni fax, ni info complémentaires... est-ce voulu ?
    Dans ce cas, vous pouvez aussi essayer cette requête :
    Vu que le fax est stocké dans les informations complémentaires, ce cas n'est pas possible

  11. #11
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    très bonne remarque, je n'avais pas fait gaffe.

    du coup la requête est encore plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT COUNT(*) AS total
    FROM client C
    LEFT OUTER JOIN cli_info CI
        ON CI.no_cli  = C.no_cli
    WHERE  CI.fax IS NULL 
          OR   CI.fax=""

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

Discussions similaires

  1. Deux requêtes en une
    Par did36 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 02/02/2010, 18h29
  2. Deux requêtes en une seule?
    Par pcsystemd dans le forum Requêtes
    Réponses: 5
    Dernier message: 09/07/2009, 16h28
  3. [MySQL] Deux requêtes dans une boucle
    Par stefanelle dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 25/02/2009, 10h41
  4. Deux requêtes en une
    Par dam28800 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 15/01/2009, 11h56
  5. Somme de deux requête en une en sql/access
    Par thepunky89 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/09/2007, 14h31

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