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

Requêtes et SQL. Discussion :

Addition de plusieurs champs [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 15
    Points : 8
    Points
    8
    Par défaut Addition de plusieurs champs
    Bonjour à tous.

    En tant que technicien SAV, je gère une BDD pour recenser toutes les pannes des appareils qui nous sont retourné.
    Afin de faire quelques statistique, mon chef me demande chaque mois des chiffres : le nombre d'appel, le nombre de retour, le nombre de panne par composant , et si ces pannes sont prise en garantie ou non.

    Habituellement j'affichais tout les tickets SAV que j'ai eu dans le mois et je relevais à la main. Mais vu que le nombre de SAV ne fait qu'augmenter (et qu'en plus on me demande de faire aussi un total par mois), j'me suis dit qu'une "petite" requête SQL pourrait me simplifier la vie.

    Mon problème, c'est pour le classement du nombre de panne par composant .
    Un appareil peut avoir plusieurs composant en panne, je peux en mettre jusqu'à 3 différentes par appareil (je choisis le type de panne via un menu déroulant, donc via une autre table). J'ai donc 3 champs Type_composant.

    Si je n'avais qu'un seul champ Type_composant j'aurais fait un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Type_Composant_1, Count(*) AS Expr1
    FROM Suivi_SAV
    GROUP BY Type_Composant_1;
    Ce qui me donne :

    Type_composant_1|Expr1
    Batterie : 4
    Bouton : 7
    Câblage : 2 etc...

    Alors comment faire pour additionner les 3 champs Type_composant pour obtenir un résultat comme ci-dessus?

    Merci d'avance!

  2. #2
    Membre éprouvé
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Points : 1 166
    Points
    1 166
    Par défaut
    Salut,

    Peut être avec une UNION:

    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
    SELECT Type_Composant_1, Count(*) AS Nombre
    FROM Suivi_SAV
    GROUP BY Type_Composant_1
     
    UNION
     
    SELECT Type_Composant_2, Count(*) AS Nombre
    FROM Suivi_SAV
    GROUP BY Type_Composant_2;
     
    UNION
     
    SELECT Type_Composant_3, Count(*) AS Nombre
    FROM Suivi_SAV
    GROUP BY Type_Composant_3;
    Cordialement,

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Merci Philippe PONS, c'est pas encore tout à fait ça, mais ça y est presque.

    Là ça m'affiche :

    batterie 7
    batterie 4
    batterie 1
    Bouton 18
    Bouton 12
    bouton 2 etc...

    Moi je voudrais plutôt :

    Batterie 12
    Boutons 32 etc...

    Peut-être que ce que je demande ne peut pas se faire directement auprès d'une seule requète SQL?

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 766
    Points : 58 083
    Points
    58 083
    Billets dans le blog
    42
    Par défaut
    bonsoir,

    Philippe a fait le plus gros du boulot...
    Il ne te reste plus qu'à reprendre sa requête, faire un regroupement sur le type de composant et faire une opération "Somme" sur le champ Nombre.


    Une autre possibilité est de faire l'UNION dans un premier temps :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Type_Composant_1 FROM Suivi_SAV
    UNION ALL
    SELECT Type_Composant_2 FROM Suivi_SAV
    UNION ALL
    SELECT Type_Composant_3 FROM Suivi_SAV
    puis reprendre la requête en faisant un regroupement sur le type de composant et faire une opération Compte(*).

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Merci pour votre aide, voilà ce que j'obtiens :

    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
    SELECT Type_Composant_1, SUM(Nombre) as Total
    FROM (
     
    SELECT Type_Composant_1, Count(*) AS Nombre
    FROM Suivi_SAV
    WHERE  (((Suivi_SAV.Date) Between DateDebut And DateFin))
    GROUP BY Type_Composant_1
     
    UNION ALL
     
    SELECT Type_Composant_2, Count(*) AS Nombre
    FROM Suivi_SAV
    WHERE  (((Suivi_SAV.Date) Between DateDebut And DateFin))
    GROUP BY Type_Composant_2
     
    UNION ALL
     
    SELECT Type_Composant_3, Count(*) AS Nombre
    FROM Suivi_SAV
    WHERE  (((Suivi_SAV.Date) Between DateDebut And DateFin))
    GROUP BY Type_Composant_3
     
    ) T
     
    Group by Type_Composant_1

    Maintenant, j'aurais une autre question... si je puis me permettre...
    J'aimerais séparer cette colonne en 2, ceux qui sont pris sous garantie et ce qui ne le sont pas.

    En suivant vos exemples je me suis dit que ça marcherais 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
    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
    SELECT Type_Composant_1, SUM(Garantie) as SousGarantie, SUM(NonGarantie) as HorsGarantie
    FROM (
     
    SELECT Type_Composant_1, Count(*) AS Garantie
    FROM Suivi_SAV
    WHERE  (((Suivi_SAV.Date) Between DateDebut And DateFin)And Pris_sous_garantie = yes)
    GROUP BY Type_Composant_1
     
    UNION ALL
     
    SELECT Type_Composant_1, Count(*) AS NonGarantie
    FROM Suivi_SAV
    WHERE  (((Suivi_SAV.Date) Between DateDebut And DateFin)And Pris_sous_garantie = No)
    GROUP BY Type_Composant_1
     
    UNION ALL
     
    SELECT Type_Composant_2, Count(*) AS Garantie
    FROM Suivi_SAV
    WHERE  (((Suivi_SAV.Date) Between DateDebut And DateFin)And Pris_sous_garantie = yes)
    GROUP BY Type_Composant_2
     
    UNION ALL
     
    SELECT Type_Composant_2, Count(*) AS NonGarantie
    FROM Suivi_SAV
    WHERE  (((Suivi_SAV.Date) Between DateDebut And DateFin)And Pris_sous_garantie = no)
    GROUP BY Type_Composant_2
     
    UNION ALL
     
    SELECT Type_Composant_3, Count(*) AS Garantie
    FROM Suivi_SAV
    WHERE  (((Suivi_SAV.Date) Between DateDebut And DateFin)And Pris_sous_garantie = yes)
    GROUP BY Type_Composant_3
     
    UNION ALL
     
    SELECT Type_Composant_3, Count(*) AS NonGarantie
    FROM Suivi_SAV
    WHERE  (((Suivi_SAV.Date) Between DateDebut And DateFin)And Pris_sous_garantie = no)
    GROUP BY Type_Composant_3
    ) T
     
    Group by Type_Composant_1
    Hors il n'en est rien... Access me demande une valeur pour l'expression "NonGarantie" et affiche les données dans une seule colonne

    Quel est l'erreur? Je précise que je débute (on doit vous la faire souvent celle-là), il y a 2 mois je ne savais même pas ce qu'était le SQL.

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 766
    Points : 58 083
    Points
    58 083
    Billets dans le blog
    42
    Par défaut
    bonsoir,

    dans l'idée, j'essaierai de créer un champ calculé [garantie] qui prend les valeurs "ok" ou ko" selon:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ...SELECT Type_Composant_1,
                   Count(*) AS Nb,
                   "ok"     AS garantie
            FROM   Suivi_SAV
            WHERE  ( ( ( Suivi_SAV.DATE ) BETWEEN DateDebut AND DateFin )
                     AND Pris_sous_garantie = yes )
            GROUP  BY Type_Composant_1, "ok"
    ...
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
     SELECT Type_Composant_1,
                   Count(*) AS Nb,
                   "ko"     AS garantie 
            FROM   Suivi_SAV
            WHERE  ( ( ( Suivi_SAV.DATE ) BETWEEN DateDebut AND DateFin )
                     AND Pris_sous_garantie = No )
            GROUP  BY Type_Composant_1, "ko"
    ...

    puis dans la requête principale, je fais une somme conditionnelle :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Type_Composant_1,
           SUM(Iif(garantie = "ok", Nb, 0)) AS SousGarantie,
           SUM(Iif(garantie = "ko", Nb, 0)) AS HorsGarantie
    FROM   ( ...

    à voir...

  7. #7
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    SELECT Type_Composant_1,
           SUM(Iif(garantie = "ok", Nb, 0)) AS SousGarantie,
           SUM(Iif(garantie = "ko", Nb, 0)) AS HorsGarantie
    		FROM   (
    	SELECT Type_Composant_1,
                   Count(*) AS Nb,
                   "ok"     AS garantie
            FROM   Suivi_SAV
            WHERE  ( ( ( Suivi_SAV.DATE ) BETWEEN DateDebut AND DateFin )
                     AND Pris_sous_garantie = yes )
            GROUP  BY Type_Composant_1, "ok"
     
    	UNION ALL
     
    	SELECT Type_Composant_1,
                   Count(*) AS Nb,
                   "ko"     AS garantie 
            FROM   Suivi_SAV
            WHERE  ( ( ( Suivi_SAV.DATE ) BETWEEN DateDebut AND DateFin )
                     AND Pris_sous_garantie = No )
            GROUP  BY Type_Composant_1, "ko"
     
    	UNION ALL
     
    	SELECT Type_Composant_2,
                   Count(*) AS Nb,
                   "ok"     AS garantie
            FROM   Suivi_SAV
            WHERE  ( ( ( Suivi_SAV.DATE ) BETWEEN DateDebut AND DateFin )
                     AND Pris_sous_garantie = yes )
            GROUP  BY Type_Composant_2, "ok"
     
    	UNION ALL
     
    	SELECT Type_Composant_2,
                   Count(*) AS Nb,
                   "ko"     AS garantie 
            FROM   Suivi_SAV
            WHERE  ( ( ( Suivi_SAV.DATE ) BETWEEN DateDebut AND DateFin )
                     AND Pris_sous_garantie = No )
            GROUP  BY Type_Composant_2, "ko"
     
    	UNION ALL
     
    	SELECT Type_Composant_3,
                   Count(*) AS Nb,
                   "ok"     AS garantie
            FROM   Suivi_SAV
            WHERE  ( ( ( Suivi_SAV.DATE ) BETWEEN DateDebut AND DateFin )
                     AND Pris_sous_garantie = yes )
            GROUP  BY Type_Composant_3, "ok"
     
    	UNION ALL
     
    	SELECT Type_Composant_3,
                   Count(*) AS Nb,
                   "ko"     AS garantie 
            FROM   Suivi_SAV
            WHERE  ( ( ( Suivi_SAV.DATE ) BETWEEN DateDebut AND DateFin )
                     AND Pris_sous_garantie = No )
            GROUP  BY Type_Composant_3, "ko"
     
    		) T
    		Group by Type_Composant_1
    C'est parfait, merci f-leb!

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

Discussions similaires

  1. Addition de plusieurs champs dans champ indépendant
    Par snoopy69 dans le forum Access
    Réponses: 3
    Dernier message: 11/11/2005, 09h37
  2. Addition de plusieurs champs...
    Par mozvillat dans le forum Langage SQL
    Réponses: 11
    Dernier message: 22/09/2005, 16h19
  3. [CR] Groupement dynamique sur plusieurs champs paramètrés
    Par CDRIK dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 07/06/2004, 17h55
  4. recuperer les id sur plusieurs champs
    Par matN59 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/03/2004, 10h23
  5. [CR9] Plusieurs champs dans details
    Par maxxou dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 28/01/2004, 13h35

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