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 :

Regrouper lignes Table


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2016
    Messages : 28
    Points : 22
    Points
    22
    Par défaut Regrouper lignes Table
    Bonjour à tous,

    Je débute en SQL et j'aimerais regrouper dans une table sous Access plusieurs lignes qui sont dans la même catégorie.

    Par exemple: Une table avec tout les employées de trois entreprises A, B et C, où il exite 10 corps de métiers avec son temps de travail par semaine. Serait-il possible de regrouper 4 corps de metiers en un, qui s'apellerait Management par exemple et de sommer les temps de travail associés

    Merci par avance de votre aide,

    En vous souhaitant une bonne journée,
    Sébastien.

  2. #2
    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 786
    Points
    30 786
    Par défaut
    Quelle est la requête actuelle ?
    Quel est son résultat ?
    Quel est le résultat attendu ?
    Qu'avez-vous déjà essayé ?

    Avez-vous lu les Règles du forum Langage SQL à lire par tous
    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.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2016
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Quelle est la requête actuelle ?

    Voici la requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT BDR.Staff_PC AS PC, E_JobTitles.Job_Titles, Sum(E_STE_Activity.STE*E_Effectifs.FTE) AS Val, E_Weight.Weight
    FROM E_Weight INNER JOIN ((E_STE_Activity INNER JOIN (E_Effectifs INNER JOIN E_JobTitles ON E_Effectifs.Employee_CD=E_JobTitles.Matricule) 
    ON E_STE_Activity.Matricule=E_Effectifs.Employee_CD) INNER JOIN BDR ON E_STE_Activity.Activity=BDR.MEMO) 
    ON E_Weight.Job_Titles=E_JobTitles.Job_Titles
    WHERE E_Effectifs.AsOf=42398 And STEAsOf=42398 And E_JobTitles.JobTitlesAsOf=42398
    GROUP BY BDR.Staff_PC, E_JobTitles.Job_Titles, E_STE_Activity.Activity, E_Weight.Weight;
    Quel est son résultat ?

    J'obtiens le Secteur, le métier, le temps de travail et le poids de ce temps de travail pour chaque personne.

    Quel est le résultat attendu ?

    J'aimerais regrouper 3 métiers en un, et récupérer la somme des temps de travail

    Qu'avez-vous déjà essayé ?

    J'ai essayé le Group By ou le With mais je ne les maitrise pas du tout :/

    Merci par avance de vote aide,
    Rainmax.

  4. #4
    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 786
    Points
    30 786
    Par défaut
    La manière la plus simple serait d'avoir une table qui décrive ces regroupements.
    Une autre manière est d'effectuer ce regroupement directement dans la requête :
    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
    SELECT  BDR.Staff_PC                            AS PC
        ,   S_JobTitles.Job_Titles
        ,   SUM(E_STE_Activity.STE*E_Effectifs.FTE) AS Val
        ,   S_JobTitles.Weight
    FROM    (   SELECT  E_JobTitles.Matricule
                      ,   E_JobTitles.JobTitlesAsOf
                      ,   CASE WHEN E_JobTitles.Job_Titles IN ('Metier1', ..., 'MetierN') 
                              THEN 'Management' 
                              ELSE E_JobTitles.Job_Titles 
                          END AS Job_Titles
                      ,   E_Weight.Weight
                  FROM    E_Weight 
                      INNER JOIN 
                          E_JobTitles
                      ON  E_Weight.Job_Titles = S_JobTitles.Job_Titles
              )   AS  S_JobTitles
        INNER JOIN
            E_Effectifs
            ON  E_Effectifs.Employee_CD = S_JobTitles.Matricule
        INNER JOIN
            E_STE_Activity
            ON  E_STE_Activity.Matricule = E_Effectifs.Employee_CD
        INNER JOIN
            BDR
            ON  E_STE_Activity.Activity = BDR.Memo
    WHERE   E_Effectifs.AsOf    = 42398
        And STEAsOf             = 42398
        And S_JobTitles.JobTitlesAsOf   = 42398
    GROUP BY BDR.Staff_PC
        ,   S_JobTitles.Job_Titles
        ,   E_STE_Activity.Activity
        ,   S_JobTitles.Weight
    ;
    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.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Petite remarque : la répétition du filtrage sur la valeur 42398 doit pouvoir être simplifiée en ajoutant des critères de jointure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE   E_Effectifs.AsOf    = 42398
        And STEAsOf             = 42398
        And S_JobTitles.JobTitlesAsOf   = 42398

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2016
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Merci beaucoup pour vos retours et vos conseils, cela m'aide enormemment !!

    De plus je cherche à créer une variable temps qui récupérer la plus grande valeur de la table AsOF pour éviter de rentrer en dure 42398 par exemple à chaque fois.

    Avez-vous une idée ?

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Vous pouvez utiliser une host variable ou récupérer automatiquement cette valeur max par un select
    quel est votre SGBD ?

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2016
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Oui par un SELECT par exemple ça serait parfait, sachant que je dois l'utiliser dans mes requêtes mais aussi en tant que simple importation. L'utilisation de Max() serait suffisante ?

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2016
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    De plus le code SQL al1_24 m'a proposé gentilement ne marche pas :/, il m'indique une erreur de syntaxe, et pour indiquer que Val de Management prend la somme des Val des métiers je peux faire comment ?

    Merci encore pour toute votre aide et vos conseils !

  10. #10
    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 786
    Points
    30 786
    Par défaut
    Où se trouve l'erreur de syntaxe ?
    J'ai répondu avec un code SQL normalisé, il faut sans aucun doute l'adapter à ton SGBD.
    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.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2016
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Voici le message d'erreur que j'obtiens:Nom : Erreur_SQL.PNG
Affichages : 115
Taille : 12,4 Ko
    Oui, j'ai modifié les nom des métiers.

    En vous souhaitant une bonne journée,
    Rainmax.

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    C'est bien ça : l'erreur est due à la particularité d'access concernant la syntaxe des jointures
    il faut empiler les jointures avec des parenthèses puis dépiler les critères de jointures

    Exemple ici : https://msdn.microsoft.com/fr-fr/lib.../ff197346.aspx

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2016
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    D'accord, merci je regarde ça de suite.

    De plus j'ai essayé de remplacer E_Effectifs.AsOf = 42398 par E_Effectifs.AsOf=Max(E_Effectifs.AsOf) cependant j'obtient ce message d'erreur:

    Nom : Erreur_Date.PNG
Affichages : 112
Taille : 19,5 Ko

    Merci par avance de votre aide
    Images attachées Images attachées  

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2016
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    J'ai résolu le problème en utilisant Asof=(SELECT Max(E_Effectifs.AsOf) FROM E_Effectifs.

    Cependant je suis toujours bloqué sur le problème de jointures sous Access, quels sont les changments que je dois efffectuer du coup ?

    Merci encore pour le temps que vous consacrez à me répondre,
    Rainmax

  15. #15
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Pour la quasi totalité des SGBD, on utilise la syntaxe standard, soit par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select col1, col2, ..., coln
    from table1 as T1
    inner join table2 as T2
       on t2.cola = T1.col5
      and t2.colb = T1.col2
    left outer join table3 as T3
       on t3 colx = t2.colc
    where...
    Requête qui sous access devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select col1, col2, ..., coln
    from table1 as T1
    inner join 
         (table2 as T2
          left join table3 as T3
            on t3 colx = t2.colc)
       on t2.cola = T1.col5
      and t2.colb = T1.col2
    where...
    il vous faut donc reprende la requête de al1_24 et l'adapter à la sauce particulière de MS Access

  16. #16
    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 786
    Points
    30 786
    Par défaut
    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
    SELECT  BDR.Staff_PC                            AS PC
        ,   S_JobTitles.Job_Titles
        ,   SUM(E_STE_Activity.STE*E_Effectifs.FTE) AS Val
        ,   S_JobTitles.Weight
    FROM    (   (   (   SELECT  E_JobTitles.Matricule
                            ,   E_JobTitles.JobTitlesAsOf
                            ,   CASE WHEN E_JobTitles.Job_Titles IN ('Metier1', ..., 'MetierN') 
                                    THEN 'Management' 
                                    ELSE E_JobTitles.Job_Titles 
                                END AS Job_Titles
                            ,   E_Weight.Weight
                        FROM    E_Weight 
                            INNER JOIN 
                                E_JobTitles
                                ON  E_Weight.Job_Titles = S_JobTitles.Job_Titles
                        WHERE   EXISTS
                                (   SELECT  NULL
                                    FROM    E_Effectifs
                                    HAVING  E_JobTitles.JobTitlesAsOf = MAX(E_Effectifs.AsOf) 
                                )
                    )   AS  S_JobTitles
                INNER JOIN
                    E_Effectifs
                    ON  E_Effectifs.Employee_CD = S_JobTitles.Matricule
                    AND E_Effectifs.AsOf        = S_JobTitles.JobTitlesAsOf
                )
            INNER JOIN
                E_STE_Activity
                ON  E_STE_Activity.Matricule = E_Effectifs.Employee_CD
            )
        INNER JOIN
            BDR
            ON  E_STE_Activity.Activity = BDR.Memo
    WHERE   STEAsOf = S_JobTitles.JobTitlesAsOf 
    GROUP BY BDR.Staff_PC
        ,   S_JobTitles.Job_Titles
        ,   E_STE_Activity.Activity
        ,   S_JobTitles.Weight
    ;
    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.

  17. #17
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2016
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Avec ce code al1_24, j'obtient ce message d'erreur:

    Nom : Erreur_SQL1.PNG
Affichages : 112
Taille : 27,2 Ko

    Même si 'Quant' est bien présent dans la table E_JobTitles.Job_Titles.
    Avez-vous une idée de la source du problème ?

    De plus, quel logiciel de traitement de texte utilisez-vous pour coder le SQL ? Car sous Access ce n'est pas très pratique :/

    Merci beaucoup
    Rainmax.

  18. #18
    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 786
    Points
    30 786
    Par défaut
    Il y a de fortes chances qu'Access ne connaisse pas l'opérateur CASE WHEN ... THEN ... ELSE ... END
    Si je me souviens bien (ça fait des lustres que je n'ai pas développé avec Access), il existe une fonction IIF() ou quelque chose du même type...
    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.

Discussions similaires

  1. regroupement des tables
    Par azde7015 dans le forum Access
    Réponses: 5
    Dernier message: 31/01/2007, 10h54
  2. requete avec regroupement multi tables
    Par Fxg dans le forum Requêtes et SQL.
    Réponses: 21
    Dernier message: 26/07/2006, 21h53
  3. requête extraction dernière ligne table
    Par COLOMBAT dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/06/2006, 09h57
  4. [débutant] Comment regrouper deux tables ?
    Par maysa dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 27/10/2004, 18h50
  5. regrouper deux tables
    Par Shabata dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/05/2003, 15h02

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