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 :

Transformer les enregistrements dupliqués en une ligne [AC-2016]


Sujet :

Requêtes et SQL.

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Points : 249
    Points
    249
    Par défaut Transformer les enregistrements dupliqués en une ligne
    Bonjour,

    J'ai un problème que je n'arrive vraiment pas à résoudre.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    SELECT OPERA_DEPO.CLNT_ID, OPERA_DEPO.TTY_NO, GCODE_DEPO_TYP_LAST.ID, GCODE_DEPO_TYP_LAST.CODE, GCODE_COLLCTN_TYP_LAST.CODE
    FROM GCODE_COLLCTN_TYP_LAST 
    INNER JOIN (GCODE_DEPO_TYP_LAST INNER JOIN OPERA_DEPO ON GCODE_DEPO_TYP_LAST.ID = OPERA_DEPO.DEPO_TYP_ID) ON GCODE_COLLCTN_TYP_LAST.ID = OPERA_DEPO.COLLCTN_TYP_ID
    GROUP BY OPERA_DEPO.CLNT_ID, OPERA_DEPO.TTY_NO, GCODE_DEPO_TYP_LAST.ID, GCODE_DEPO_TYP_LAST.CODE, GCODE_COLLCTN_TYP_LAST.CODE;
    La requête ci-dessus me donne ce résultat.

    Nom : rendu_req.png
Affichages : 81
Taille : 2,5 Ko

    J'aimerais par la suite avoir exactement ça :

    Nom : Voulu.png
Affichages : 83
Taille : 4,8 Ko

    Tous les numéro TTP doivent être uniques.

    Mon idée est de partir d'une table contenant tous mes numéro TTP uniques et de les dupliquer pour chaque ID (voir tableau ci-dessous) afin de faire un LEFT Join/RIGHT JOIN avec la requête précédente qui me permettra ensuite d'avoir des NULL là où il n'y a pas d'occurrences.

    TTP_NO ID
    1006124 1
    1006124 2
    1006124 5
    1007167 1
    1007167 2
    1007167 5

    Le gros hic, c'est que cela prend beaucoup de temps alors que cette étape n'est qu'une petite partie de ma requête globale .

    Auriez-vous une idée plus ingénieuse (rapide) ?

    Merci par avance pour votre aide
    Lorsque vous avez obtenu une réponse satisfaisante à votre discussion, N'oubliez pas de cliquer sur

    L'erreur n'annule pas la valeur de l'effort accompli.

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Je pense qu'une requete d'analyse croisee dynamique repondrait a ton besoin.
    Utilise l'assistant de creation de requete, la syntaxe est un poil compliquee.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Points : 249
    Points
    249
    Par défaut
    Bonjour,

    Merci beaucoup pour votre réponse. ça marche parfaitement mais c'est extrêmement couteux en temps, c'est assez problématique.

    Il n'y a vraiment une solution qui vous semble exploitable en utilisant LEFT JOIN ou RIGHT JOIN ? Je pensais à la création de trois tables pour chacune des colonnes et faire le lien ensuite mais je peine à réussir.

    Merci pour votre aide
    Lorsque vous avez obtenu une réponse satisfaisante à votre discussion, N'oubliez pas de cliquer sur

    L'erreur n'annule pas la valeur de l'effort accompli.

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Oui c'est possible aussi si tes colonnes sont "fixes".

    Tu fais une requete qui te donne la liste de toutes les valeurs possibles dans la preniere colonne :
    reqListe
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select [TaTable].[TTP_NO] from [TaTable]
    group by [TaTable].[TTP_NO]
    odrer by [TaTable].[TTP_NO]

    Tu fais une requete pour les donnees de chaque colonnes de donnees.

    reqPREMD
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select [TaTable].[TTP_NO], [TaTable].[DEPO]="PREMD" from [TaTable]
    group by [TaTable].[TTP_NO], [TaTable].[DEPO]
    order by [TaTable].[TTP_NO]

    Puis tu fais une requete pour afficher les resultats qui prend reqListe et qui fait une jointure a gauche avec les 3 requites de donnees sur [TTP_NO].

    Pour cette requete, utilise l'editeur de requete car la syntaxe de Access est assez tordue et la tu vas avoir les jointures et les alias de colonne a gerer ... crois moi, tu n'as pas envie de l'ecrire toi-meme.

    A vrai dire l'editeur de SQL de Access est tellement pourri que j'evite de l'utiliser sauf si vraiment je n'ai pas le choix.

    Si tu as encore des problemes de performance, tu peux stocker les resultats dans des tables intermediaire.

    Derniere possibilite, exporter tes donnees vers Excel et faire cela avec un tableau croise de Excel.
    C'est puissant et souple et pas prise de tete comme Access (bon ca prend un peu la tete pour les maitriser au depart).

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Points : 249
    Points
    249
    Par défaut
    Bonjour,

    Je vous remercie beaucoup pour votre aide. Je vous explique le contexte : je suis obligé de changer les bases qu'utilisaient les requêtes ACCESS de mon formulaire. La requête que j'essaie de changer dans le cas présent est la 2ème requête qui est exécutée après activation d'un des boutons du formulaire par l'utilisateur. Vous comprendrez que je n'ai pas d'autres choix que d'optimiser la requête au mieux.

    Ce que je recherche vraiment, c'est récupérérer les types de COLLECTN en fonction des DEPO comme je l'ai expliqué plus haut.

    D'abord, j'écris la requête (OPERA_DEP_CAL) que vous verrez sur l'image ci-dessous, qui me donnent tous les TTY_NO en les dupliquant en fonction du DEPO et du COLLCTN.

    Nom : test_r.jpg
Affichages : 69
Taille : 83,4 Ko


    Si je prends le premier rendu de l'affichage, le TTY_NO est 1001251 , on a deux types de DEPO qui sont ANNUD et LOSSD associés tous les deux à CASH.

    J'aimerais donc avoir par la suite :

    TTY_NO ACTUD LOSSD PREMD ANNUD
    1001251 CASH CASH

    En gros, un numéro de traité doit être unique avec des vides là où il n'y a rien.

    J'ai commencé par créer la table PREMD en m'inspirant de votre exemple mais je ne parviens à avoir le résultat que je veux. :S

    Ce que je veux, c'est récupérer tous les TTY_NO présents dans la table TTY_NO (c'est pour ça que j'utilise le LEFT JOIN), je m'attends normalement si j'ai bien compris à avoir des vides dans ma table PREMD là où il n'y a pas de COLLCTN.

    Pour le TTY_NO utilisé ci-dessus par exemple 1001251 , j'aimerais qu'il soit présent dans ma sortie mais qu'il soit associé à un vide alors qu'il n'existe pas du tout dans ma table.

    La requête ne me donne que tous les COLLCTN qui sont associés à PREMD. Le LEFT Join est il inutile ? Ou bien est ce que je le fais mal ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT OPERA_TTY.TTY_NO, OPERA_DEP_CAL.COLLCTN AS PREM_D
    FROM OPERA_TTY LEFT JOIN OPERA_DEP_CAL ON OPERA_TTY.TTY_NO = OPERA_DEP_CAL.TTY_NO
    WHERE (((OPERA_DEP_CAL.DEPO)='PREMD'))
    ORDER BY OPERA_TTY.TTY_NO;

    Merci beaucoup pour votre aide.
    Lorsque vous avez obtenu une réponse satisfaisante à votre discussion, N'oubliez pas de cliquer sur

    L'erreur n'annule pas la valeur de l'effort accompli.

  6. #6
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Points : 249
    Points
    249
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Puis tu fais une requete pour afficher les resultats qui prend reqListe et qui fait une jointure a gauche avec les 3 requites de donnees sur [TTP_NO].

    Pour cette requete, utilise l'editeur de requete car la syntaxe de Access est assez tordue et la tu vas avoir les jointures et les alias de colonne a gerer ... crois moi, tu n'as pas envie de l'ecrire toi-meme.
    Rebonjour,

    J'avais mal compris vos indications. J'obtiens le finalement le résultat voulu en ayant bien pris note de vos explications et en ayant utilisé l'exécuteur de requêtes ACCESS. J'avoue que c'est bien tordu sinon :S

    Merci beaucoup pour votre aide.
    Lorsque vous avez obtenu une réponse satisfaisante à votre discussion, N'oubliez pas de cliquer sur

    L'erreur n'annule pas la valeur de l'effort accompli.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/05/2008, 23h39
  2. retirer les enregistrements présents dans une autre table
    Par Didine1801 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 16/10/2007, 16h07
  3. Réponses: 2
    Dernier message: 30/05/2007, 14h53
  4. Réponses: 2
    Dernier message: 07/07/2006, 01h26
  5. Identifier les enregistrements Lu d'une table
    Par aityahia dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/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