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 :

[Access] un group by qui me fait perdre la tete


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 56
    Points
    56
    Par défaut [Access] un group by qui me fait perdre la tete
    Bonjour,
    A mon boulot je seche sur un group by...et pourtant je pense pas être un débutant mais ca fait un moment que je n'ai pas fait de sql...
    Alors voila ma requete :
    select serveur,stk,sum(quantite) as count,ps1,ps2,ps3,ps4,ps5,ps6
    from table
    where datearriv > trunc(sysdate)
    and not stk =4
    group by serveur,stk;

    Je voudrais groupé le sum(quantite) alias count par serveur et stk, mais aussi récupérer les ps1,ps2...ps6 en même temps sans les groupés avec ou limite, faire un groupe by serveur,stk, count, ps1...ps2, mais il ne l'accepte pas.
    Auriez vous une suggestion?
    merci d'avance a ceux qui répondront.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 140
    Points : 166
    Points
    166
    Par défaut
    Bonjour,

    Dans un group by, tu es obligé de répeter les champs qui ne sont pas dans une aggregation.

    Ici tu dois avoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select serveur,stk,sum(quantite) as count,ps1,ps2,ps3,ps4,ps5,ps6 
    from table
    where datearriv > trunc(sysdate)
    and not stk =4
    group by serveur,stk,ps1,ps2,ps3,ps4,ps5,ps6

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 849
    Points : 52 968
    Points
    52 968
    Billets dans le blog
    6
    Par défaut
    Comme tu n'a pas renseigné le SGBD je te donne la réponse en SQL normatif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select serveur, stk, COMPTE,
           ps1,ps2,ps3,ps4,ps5,ps6 
    from   (SELECT serveur, stk, SUM(quantite) as COMPTE
            FROM   MaTable
            WHERE  datearriv > CURRENT_DATE
              AND  NOT stk =4
            GROUP  BY serveur,stk) T
           INNER JOIN table TT
                 ON (T.serveur, T.stk) = (TT.serveur, TT.stk)
    A +

  4. #4
    Membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 56
    Points
    56
    Par défaut
    désolé, j'aurai du y penser : je suis sous acces pour faire mes tests, mais sous oracle dans mon prog...
    Lorsque je lance ta requête SQlPro cela me dit erreur de syntaxe, probleme avec la virgule dans ON (T.serveur, T.stk) = (TT.serveur, TT.stk)
    J'ai cherché un peu sur le site et par moi meme.
    J'ai tenté le :
    T.serveur = TT.serveur and T.stk = TT.stk mais ca fait planté access et pas trouvé une double jointure sous access...
    Je vous remercie enormement pour vos réponses (désolé, je ne bosse pas l'apres midi, d'ou labsence de reponse avant).

    edit : j'ai un autre mess qui me dit que serveur peut designer plusieurs tables dans mon instruction

  5. #5
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT TT.serveur, TR.stk,
    ...
    INNER JOIN table TT
          ON (T.serveur = TT.serveur AND T.stk = TT.stk)

  6. #6
    Membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 56
    Points
    56
    Par défaut
    Merci pour ta réponse rapide.
    voila ce que j'ai écrit comme requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select TT.serveur, TT.stk, COMPTE,
           ps1,ps2,ps3,ps4,ps5,ps6 
    from   (SELECT serveur, stk, SUM(quantite) as COMPTE
            FROM   ax2000_axtbhisto
            WHERE  datearriv > #10/02/2006#
              AND  NOT stk ="4"
            GROUP  BY serveur,stk) T
    INNER JOIN ax2000_axtbhisto TT
    ON (T.serveur = TT.serveur AND T.stk = TT.stk)
    cela fonctionne presque, voila ce que cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Serveur,    stk, compte, ps1, ps2, ps3, ps4, ps5, ps6
    01    03    6500   580   00   652   548   253   253
    01    03    6500   580   00   652   548   253   253
    01    02    5231   256   12   258   365   459   963
    01    02    5231   256   12   258   365   459   963
    En clair, il double les lignes...
    Tu n'aurais pas un petite astuce pour y remédier?

    Et autre chose, quand je passerai sur oracle (je ferai de lasp qui requetra sur une base oracle), y ora t il qqchose a changer?

    Merci beaucoup de t'occuper de moi

  7. #7
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Essaye de rajouter un DISTINCT pour qu'à l'affichage, tu n'aies plus de doublons
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT Champ1, Champ2, etc ...
    ou alors, peut être que la condition de jointure n'est pas suffisante et qu'il manque une condition à rajouter ? Quelle est la clé primaire de ta table ?

    pour Oracle :

    1) la condition sur la date va échouer, les dièses sont spécifiques à Access : il te faudra écrire ta condition comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE  datearriv > TO_DATE('10/02/2006', 'dd/mm/yyyy')
    2) quelle est ta version d'Oracle : si c'est la 8, ou inférieure, le mot-clé JOIN n'est pas supporté et tu devras ré-écrire ta jointure dans le WHERE

    3) Le séparateur standard de chaîne de caractères est le quote ', et pas la guillemets", tu devras remplacer ta clause :
    4) Par contre, sous Oracle, le ROW VALUE CONSTRUCTOR est supporté, çàd que tu devrais pouvoir écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           INNER JOIN table TT
                 ON (T.serveur, T.stk) = (TT.serveur, TT.stk)
    (mais c'est facultatif )

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 04/06/2011, 07h52
  2. Réponses: 12
    Dernier message: 31/03/2009, 19h05
  3. [debutant]programme qui ne fait rien.
    Par Battosaiii dans le forum Interfaces Graphiques en Java
    Réponses: 10
    Dernier message: 04/12/2005, 22h19
  4. procédure stockée qui ne fait rien
    Par trotters213 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 10/03/2005, 20h25
  5. fonction qui en fait planter une autre
    Par ickis dans le forum C
    Réponses: 5
    Dernier message: 18/08/2003, 21h33

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