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 :

Les requêtes imbriquées


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 59
    Points
    59
    Par défaut Les requêtes imbriquées
    Bonjour,

    Je souhaite calculer sur mes serveurs de sauvegarde le nombre total des jobs, avec le total des clients sur un serveur, total des job en full statut ok, statut ko et total incrémentiel ok et ko.

    voici le fichier attaché de la structure de mes tables (job, statut, alarm, et job_type.

    Merci encore.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 59
    Points
    59
    Par défaut
    Désolé, j'ai oublié le tableau de sortie:

    Nom serveur
    Total clients
    Total Job
    Total full OK
    Total full KO
    Total incr OK
    Total incr KO

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Peux-tu nous présenter la requête que tu as déjà préparée ?
    Nous t'aiderons à la faire évoluer
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 59
    Points
    59
    Par défaut
    voici la requête que j'ai fait pour le total des jobs:
    (je ne sais pas si c'est comme cela qu'il faut utiliser les balises)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select count(*) as TOTALJOB, server_name  
    from crp_tb_job 
    where job_state = 3
    group by server_name

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Pour calculer tes autres totaux, il faut commencer par faire des jointures entre ta table JOB et les tables de référence.

    Pour les balises, il suffit simplement de sélectionner ton code et cliquer sur le bouton marqué # dans la barre d'outils de la fenêtre d'édition (celle où tu saisis ton message). Les balises correctes seront automatiquement placées au début et à la fin de la zone sélectionnée.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 59
    Points
    59
    Par défaut
    Merci pour ta réponse, mon pb est comment grouper tous les tautaux dans une seule requête? Je ne suis pas developpeur sql, non pas admin Base de données, donc je ne connais pas très bien sql, juste un selct from, requêtes très simple! Ce qui m'interesse c'est la syntax, je me débrouillerai pour le nom des champs, ... d'autant plus que je n'ai pas vraiment besoin de faire la jointure, je peux utiliser les champs de ma table job uniquement.

    Merci encore.

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Pour faire des comptages sur une valeur précise d'une colonne, tu peux utiliser une expression CASE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT server_name
     , COUNT(*) AS totaljob
     , SUM(CASE colonne = valeur THEN 1 ELSE 0 END) AS nombre_colonne_valeur
    FROM crp_tb_job 
    GROUP BY server_name
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Vous pouvez créer une requête pour chaque total, puis les joindre sur le nom de serveur.
    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
    19
    20
    21
    22
    23
    24
     
    SELECT 
         Serveurs.server_name,
         TotalJob.TOTALJOB,
         TotalClient.TOTALCLIENT,
         ...
    FROM 
         ( SELECT DISTINCT server_name FROM crp_tb_job ) Serveurs
    LEFT JOIN
         (
          SELECT count(*) AS TOTALJOB, server_name  
          FROM crp_tb_job 
          WHERE job_state = 3
          GROUP BY server_name
         ) TotalJob
         ON TotalJob.server_name = Serveurs.server_name
    LEFT JOIN
         (
          SELECT count(DISTINCT Client) AS TOTALCLIENT, server_name  
          FROM crp_tb_job 
          GROUP BY server_name
         ) TotalClient
         ON TotalClient.server_name = Serveurs.server_name
    LEFT JOIN ...
    Selon votre besoin vous pouvez également utiliser CASE pour conditionner vos sommes, et ainsi vous épargner quelques jointures.
    Mais qu'est ce qu'un FULL OK, un FULL KO, un INCR OK et un INCR KO?
    En admettant :
    - FULL OK = job_type_id = 121 ET job_alarm = 0
    - FULL KO = job_type_id = 121 ET job_alarm <> 0
    - INCR OK = job_type_id = 122 ET job_alarm = 0
    - INCR KO = job_type_id = 122 ET job_alarm <> 0
    On obtient :
    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
    19
    20
    21
    22
    23
    24
    25
    26
     
    SELECT 
         server_name,
         count(DISTINCT client) AS TotalClient,
         CASE WHEN job_state = 3
              THEN 1
              ELSE 0
         END AS TotalJobDone,
         CASE WHEN job_type_id = 121 AND job_alarm = 0
              THEN 1
              ELSE 0
         END AS TotalFullOK,
         CASE WHEN job_type_id = 121 AND job_alarm <> 0
              THEN 1
              ELSE 0
         END AS TotalFullKO,
         CASE WHEN job_type_id = 122 AND job_alarm = 0
              THEN 1
              ELSE 0
         END AS TotalIncrOK,
         CASE WHEN job_type_id = 122 AND job_alarm <> 0
              THEN 1
              ELSE 0
         END AS TotalIncrKO
    FROM crp_tb_job
    GROUP BY server_name

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 59
    Points
    59
    Par défaut
    Je pense que sum dans ce cas n'est pas possible, car ce n'est pas des entiers mais c'est des chaines de caractères.

    Par exemple: le totalClient, je ne peux pas faire sum (client1, client2....), pareil aussi pour les backup_full ou backup_incr.

    Je dois faire des select count dans une autre select, count.... mais pas de sum.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    C'est tout à fait possible.
    Il s'agit de dire :
    "SI UneColonne = 'UneValeur' ALORS 1 SINON 0"
    La somme portera sur le resultat de cette condition, qui au final vous fera un "count" des lignes qui la vérifient.

  11. #11
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 59
    Points
    59
    Par défaut
    Merci pour le code, je vais tester la requête, et je complète derière par le code final utilisé si je réussi à faire tourner correctement la requête.

  12. #12
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 59
    Points
    59
    Par défaut
    Est ce que je peux faire les deux codes en même temps?

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    SELECT Serveurs.server_name, TotalJob.TOTALJOB, TotalClient.TOTALCLIENT, TotalFullOK.TOTALFULLOK, TotalFullKO.TOTALFULLKO, TotalIncrOK.TOTALINCROK, TotalIncrKO.TOTALINCRKO
    FROM (
    SELECT DISTINCT server_name
    FROM crp_tb_job
    ) AS Serveurs
     
    LEFT JOIN (
     
    SELECT count( * ) AS TOTALJOB, server_name
    FROM crp_tb_job
    WHERE job_state =3
    GROUP BY server_name
    )TotalJob ON TotalJob.server_name = Serveurs.server_name
     
    LEFT JOIN (
     
    SELECT count( DISTINCT Client_name ) AS TOTALCLIENT, server_name
    FROM crp_tb_job
    GROUP BY server_name
    )TotalClient ON TotalClient.server_name = Serveurs.server_name
     
    LEFT JOIN (
    SELECT count( DISTINCT job_type_id ) AS TOTALFULLOK, server_name
    FROM crp_tb_job
    WHERE job_type_id =121
    AND job_alarm =0
    GROUP BY server_name
    )TotalFullOK ON TotalFullOK.server_name = Serveurs.server_name 
     
    LEFT JOIN (
    SELECT count( DISTINCT job_type_id ) AS TOTALFULLKO, server_name
    FROM crp_tb_job
    WHERE job_type_id =121
    AND job_alarm = (1,2,3)
    GROUP BY server_name
    )TotalFullKO ON TotalFullKO.server_name = Serveurs.server_name 
     
    LEFT JOIN (
    SELECT count( DISTINCT job_type_id ) AS TOTALINCROK, server_name
    FROM crp_tb_job
    WHERE job_type_id =122
    AND job_alarm =0
    GROUP BY server_name
    )TotalIncrOK ON TotalIncrOK.server_name = Serveurs.server_name 
     
    LEFT JOIN (
    SELECT count( DISTINCT job_type_id ) AS TOTALFULLOK, server_name
    FROM crp_tb_job
    WHERE job_type_id =122
    AND job_alarm =(1,2,3)
    GROUP BY server_name
    )TotalIncrKO ON TotalIncrKO.server_name = Serveurs.server_name
    Car pour le moment, ca ne marche pas

    Merci

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Qu'avez vous essayé jusqu'à maintenant, et que veut dire 'ne marche pas'? Un code erreur? Un resultat vide?

    Déjà, ceci n'est pas correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND job_alarm = (1,2,3)
    La valeur de la colonne ne peut pas être égale à une liste, mais inclue dans une liste, remplacez = par IN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND job_alarm IN (1,2,3)

  14. #14
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 59
    Points
    59
    Par défaut
    ok, j'ai corrigé le code "IN (1,2,3)

    mais la même erreur:

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    SELECT Serveurs.server_name, TotalJob.TOTALJOB, TotalClient.TOTALCLIENT, TotalFullOK.TOTALFULLOK, TotalFullKO.TOTALFULLKO, TotalIncrOK.TOTALINCROK, TotalIncrKO.TOTALINCRKO
    FROM (
    SELECT DISTINCT server_name
    FROM crp_tb_job
    ) AS Serveurs
     
    LEFT JOIN (
     
    SELECT count( * ) AS TOTALJOB, server_name
    FROM crp_tb_job
    WHERE job_state =3
    GROUP BY server_name
    )TotalJob ON TotalJob.server_name = Serveurs.server_name
     
    LEFT JOIN (
     
    SELECT count( DISTINCT Client_name ) AS TOTALCLIENT, server_name
    FROM crp_tb_job
    GROUP BY server_name
    )TotalClient ON TotalClient.server_name = Serveurs.server_name
     
    LEFT JOIN (
    SELECT count( DISTINCT job_type_id ) AS TOTALFULLOK, server_name
    FROM crp_tb_job
    WHERE job_type_id =121
    AND job_alarm =0
    GROUP BY server_name
    )TotalFullOK ON TotalFullOK.server_name = Serveurs.server_name  
     
    LEFT JOIN (
    SELECT count( DISTINCT job_type_id ) AS TOTALFULLKO, server_name
    FROM crp_tb_job
    WHERE job_type_id =121
    AND job_alarm IN(1,2,3)
    GROUP BY server_name
    )TotalFullKO ON TotalFullKO.server_name = Serveurs.server_name  
     
    LEFT JOIN (
    SELECT count( DISTINCT job_type_id ) AS TOTALINCROK, server_name
    FROM crp_tb_job
    WHERE job_type_id =122
    AND job_alarm =0
    GROUP BY server_name
    )TotalIncrOK ON TotalIncrOK.server_name = Serveurs.server_name  
     
    LEFT JOIN (
    SELECT count( DISTINCT job_type_id ) AS TOTALFULLOK, server_name
    FROM crp_tb_job
    WHERE job_type_id =122
    AND job_alarm IN (1,2,3)
    GROUP BY server_name
    )TotalIncrKO ON TotalIncrKO.server_name = Serveurs.server_name
    voici l'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    #1054 - Unknown column 'TotalIncrKO.TOTALINCRKO' in 'field list'
    Dans ma liste, j'ai normalement mes déclarations, je ne vois pas cette erreur.

  15. #15
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 59
    Points
    59
    Par défaut
    Désolé c'est une erreur de ma part.

    le code marche, maintenant je vais juste voir les données en sortie.

    merci beaucoup

  16. #16
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 59
    Points
    59
    Par défaut
    Merci, Merci beaucoup Snipah! ca marche, mon résultat n'est pas bon, mais c'est coherent avec le contenu de ma table que je dois maintenant corrigé!


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

Discussions similaires

  1. problème avec les requêtes imbriquées
    Par menoulette dans le forum Bases de données
    Réponses: 3
    Dernier message: 28/10/2013, 11h24
  2. Quand utiliser les requêtes imbriquées ?
    Par yann18 dans le forum Débuter
    Réponses: 2
    Dernier message: 29/06/2011, 21h11
  3. [MySQL] Imbriquer les requêtes
    Par fey dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 16/07/2008, 19h22
  4. [MySQL] Est-ce que php supporte les requêtes imbriquées ?
    Par dahan dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 08/03/2006, 18h50

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