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 :

Ajouter le résultat d'une requête à une table


Sujet :

Requêtes et SQL.

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 6
    Points
    6
    Par défaut Ajouter le résultat d'une requête à une table
    Bonjour,

    C'est la toute première fois que je travaille sous Access (et la toute première fois que je manipule du SQL), et je galère un peu.

    Je vous explique du mieux que je peux mon problème: j'ai une table (test2.xls) qui contient plusieurs enregistrements concernant trois établissements. Il y a trois services dont deux qui sont liés et dont j'aimerais sommer les effectifs en distinguant temps plein et temps partiel.

    J'arrive, via des requêtes du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT identifiant, SUM(effectif) AS "Effectif B+C"
    FROM table1
    WHERE (service="B" OR service="C") and Statut="Temps plein"
    GROUP BY identifiant;
    à obtenir, indépendemment, mes différentes colonnes.

    L'étape suivante serait d'ajouter les résultats de ces diverses requêtes à une table existante (deuxième onglet de la feuille, en gras ce qui est présent à la base, et en normal ce que j'aimerais rajouter automatiquement) en fonction de l'identifiant.

    J'ai lu dans un topic juste en dessous sur cette page un truc qui semble correspondre à mon problème, mais je n'arrive pas à le mettre en pratique. Concrètement, quelle modification dois-je apporter à ma requête pour que le résultat qu'elle renvoie soit ajouté à la table de destination (appelons la table2 du coup...) ? Je crois comprendre que ça commence par une syntaxe du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ALTER TABLE test2
    ADD
    mais ma compréhension (si tant est qu'elle soit bonne) du problème s'arrête là.

    Si quelqu'un pouvait me dépanner je lui en serais reconnaissant.

    Tant que j'y suis, vu que mon cas "réel" implique une bonne cinquantaine de colonnes, y a-t-il un moyen de ne pas avoir à écrire une requête pour chaque, et de faire une grosse requête globale à la place ?

    Merci d'avance.
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour et bienvenu,

    Tu travail sur Access ou Excel ???

    C'est plus pratique d'avoir la description des tables...


  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Non désolé j'aurais dû préciser, les fichiers Excel sont là à titre purement informatif, pour donner un exemple de là où je pars, et de là où je veux arriver. En pratique je travaille sur une base Access composée d'un grand nombre de tables, je n'ai pas besoin d'Excel.

    Sinon qu'entends-tu par "Description des tables" ?

  4. #4
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonsoir,

    Du style, nom des colonnes, types valeurs !!!

    Par exemple (Certes non approprié à Access, je sais pas la peine de me poser la question, mais en gros)
    CREATE TABLE `t_membre` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
    `nom` VARCHAR(100) NOT NULL,
    `email` VARCHAR(255) NOT NULL,
    `fullnews` TINYINT(1) UNSIGNED NOT NULL DEFAULT TRUE,

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    bah, tout est dans le fichier joint l'upload n'a pas fonctionné ?

    en gros identifiant est une variable numérique, mais qui pourrait tout aussi bien être une chaine de caractères vu qu'aucune manip n'est faite dessus, le service et le statut sont des chaines de caractère, et les effectifs sont des entiers positifs ou nuls.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    Salut,
    Ce qui ressort de ta présentation :
    Le plus important et base de départ – notion de service
    Donc 1 service = 1 table, plusieurs éléments et plusieurs villes.
    Puis une table ville avec ce qui semble un identifiant ville « 11111,22222 »
    Je verrai d’une façon très simplifiée la structure d’une base qui correspond comme celle jointe.
    On peut effectivement faire beaucoup plus sophistiquée – Ex rien qu’en important ta feuille 1, en y rajoutant une requête pour l’ajout des villes – puis en la transformant en requête tableau croisé dynamique – mais ça sera complexe et après est-ce que cela mieux pour la saisie.
    Regardes la base jointe et vois ce que tu peux en tirer pour commencer.
    Bon courage et plus.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Merci pour votre méthode, mais je crains que ma demande ait été mal interprétée: sommer les effectifs des services, c'est justement la partie du travail que j'ai réussie ! Là où je sèche, c'est pour que le résultat de ma requête soit ajouté à la base. Dans votre exemple ça serait donc d'ajouter le résultat de la requête "Résultat_Définitif" à la table "ville" en faisant la jointure sur le champ "identifiant". Je n'ai pas cherché de mon côté ce week end, je m'y remets à l'instant avec l'espoir de trouver assez vite, mais toute aide sur ce point sera la bienvenue...

    Merci d'avance.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Rebonjour,

    Après quelques recherches j'ai en fait surtout réussi à soulever un nouveau problème...

    j'essaie de créer une table puis de lui ajouter le résultat d'une requête, en utilisant cette syntaxe aperçue à divers endroits:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE XX AS SELECT * FROM YY ;
    Mais Access n'a pas l'air d'aimer et me renvoie une erreur 3290 (Syntax error in CREATE TABLE statement). Apparemment c'est le terme SELECT qui lui plait pas, mais je pige pas pourquoi ?

    Si je me contente de créer la table seule et de la remplir ensuite, ça semble fonctionner, mais ce n'est pas forcément la méthode qui m'arrange le plus...

  9. #9
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    salut,
    je pense que tu as un petit problème d'approche d'une BDR, normal au début et pour cela tu trouveras sur le forum des tas du tutos à différents niveaux.
    1) quand tu disposes d'une requête qui correspond à un besoin il est normalement inutile d'aller plus loin - elle fait partie intégrante de la base. on peut lui attacher des formulaires, des etats, d'autres requêtes, d'autres tables.
    2) au peu effectivement si besoin la transformer en table et cela est très facile dans le QBE, on copie la requête, en cas de.... et on transforme la copie en création de table.
    toujours sur la même base j'ai transformé la requête en table. j'espère que l'on est sur la même longueur d'onde car sinon il faut reposer le problème.

  10. #10
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 591
    Points
    3 591
    Billets dans le blog
    8
    Par défaut
    Salut

    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    INSERT INTO nomtabledestination (nomchamprecevantidentifiant, nomchamprecevant[Effectif B+C])
    SELECT identifiant, SUM(effectif) AS "Effectif B+C"
    FROM table1
    WHERE (service="B" OR service="C") and Statut="Temps plein"
    GROUP BY identifiant;
    @+

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Bonjour, et merci à vous deux.

    Je n'ai pas trop le temps de bosser sur ce projet aujourd'hui, mais dès que je peux je m'y remets, j'essaie ce que vous m'avez suggéré et je vous fais signe.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Je remonte ce topic d'outre-tombe, j'ai dû lâcher ce projet pendant un certain temps à cause d'autres trucs plus urgents...

    J'aurais une question au sujet du code proposé par alassanediakite. Il fonctionne, mais le problème c'est qu'Access ne comprend pas qu'il doit fusionner le résultat de la requête avec la table de destination, en fonction de l'identifiant.

    En clair il crée de nouveaux enregistrements au lieu d'altérer ceux qui existent déjà, et je me retrouve avec quel chose du style:

    identifiant | effectif | service

    111111 | 15 |
    111111 | | B+C

    Alors que je voudrais

    identifiant | effectif | service

    111111 | 15 | B+C


    Que dois-je rajouter ? J'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO test2 (identifiant, effectif)
    SELECT identifiant, SUM(effectif) AS "Effectif B+C"
    FROM test1 join test2 on test.identifiant = test2.identifiant
    WHERE (service="B" OR service="C") and Statut="Temps plein"
    GROUP BY identifiant;
    en suivant un tuto, mais ça ne marche pas... Apparemment c'est du SQL2, que tous les SGBD ne supportent pas (j'ai Access 2003). On peut apparemment procéder avec un WHERE mais je n'arrive pas à trouver la bonne syntaxe...


    Deuxième question: si je veux rajouter à tout ça un champ correspond à l'effectif du service A (délaissé jusqu'à présent, le pauvre), comment procéder ? Je crois que j'ai déjà posé la question avant mais est-il possible de faire des requêtes multiples ? En effet la base que je cherche à construire contiendra la bagatelle de 500 champs environ, alors si je pouvais trouver un moyen de pas me coltiner 500 requêtes séparées mais plutôt une (very) big requête...

    Merci d'avance pour votre aide et votre patience

  13. #13
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    salut,
    pour des besoins de place j'avais supprimé ma proposition de base jointe,
    je la remets si ça peut être utile - il y a une requête ajout à une table existante - je n'ai pas trop le temps ce soir d'approfondir ton dernier post,
    à +

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    salut,

    merci je teste ça demain dès que je peux et je te fais un feedback en fonction de ce que je comprends

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Salut,

    J'ai regardé tes requêtes, je les comprends mais il y a toutefois un problème: ta construction suppose qu'il existe une table par service, or ce n'est pas le cas sur celle que j'utilise (bon je peux le dire concrètement à la limite, ça n'est pas non plus secret-défense: je travaille sur la base SAE de la DREES et sur la base PMSI), qui se présente comme le premier onglet du fichier joint.

    J'aimerais pouvoir adapter ce que tu as fait pour avoir une requête qui me sorte, dans une même table, un champ "Service A" et un champ "Service B+C" (enfin, en distinguant également temps plein / temps partiel, mais une fois que je saurai faire l'un je saurai faire l'autre, en principe). Et ensuite faire une jointure avec une table toute prête...

    J'ai reformulé ça dans le fichier joint. Le premier onglet c'est ma table brute, le second c'est ce que j'aimerais que la requête me donne, le 3e la table destinataire (la seule qui sera utile à la fin), et enfin dans le 4e onglet, le résultat de la fusion des onglets 2 et 3.

    Concernant la ville, il faut la voir comme une variable qui était déjà là de base dans la table de destination, mais qui n'est pas supposée servir... Elle illustre juste le fait que je veux rajouter le résultat de la requête à une table qui n'est pas vide.

    Et en pratique j'aurai des centaines de requête du genre à faire... c'est pourquoi j'aimerais savoir si des requêtes multiples sont possibles, histoire d'optimiser.
    Fichiers attachés Fichiers attachés

  16. #16
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    salut,
    il est tard et j'arrête en cours de route, a mon âge il faut se surveiller,
    pour te faire patienter ci joint un commencement pour te faire patienter dans l'hypothese où je pourrais aller plus loin - pour le moment tu as la table que j'ai importer d'excel et donc conforme - mais attention gros risque de saisie pour le statut - il faut absoluement que la casse soit respectée !!!! sinon adieu l'infor tronquée - j'ai essayé de faire une seule requête mais je n'ai pas testé si avec plusieur l'exécution n'était pas plus rapide à voir si ta base est costaud.
    teste pour le moment et développe si possible sinon à +

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    salut,

    merci pour la peine que tu te donnes, je teste ça dès que je peux.

  18. #18
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    bonjour,
    je devais être effectivement fatigué hier soir car avec 5 mn de plus, on importe ta table destination, on la relie a table brute par une relation 1 a plusieur sur le champ identifiant mis en clé primaire table destination et secondaire sur table destination - et on fait une requête qui te donne ta table intermediaire en joignant table destination et table brute Requête.
    c'est normalement suffisant - on peut créer bien sur une table principale avec cette requête mais a part la mise en réseau "elle seulement", je ne vois pas l'intérêt....enfin je connais pas tout ton problème.
    il faudrait avec cette requête la transformer en requête création de table, c'est très simple, mais il faut penser ensuite à en créer une de mise a jour.
    je te joins la dernière mouture.
    à +

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Salut,

    J'ai regardé, et autant je comprends très bien la requête de fusion des deux tables, autant celle qui s'appelle "Table brute requête" j'ai du mal... J'ai essayé de la comprendre en SQL, mais les inner join imbriqués ont eu raison de moi. Et même en design view je saisis pas... pourquoi y a-t-il des tables brutes 1, 2, 3, 4, 5 ? A quel moment ont-elles été créées et dans quel but ?

    Merci d'avance

  20. #20
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    salut,
    les tables brutes 1,2...n...., sont des ajouts dans le QBE de la table brute base (le principe et rajouter à chaque fois la même table qui prend un indice +1 et d'extraire les champs que l'on veut traiter - on laisse le ou les champs qui ne changent pas et on les joint pour signaler qu'on veut les mêmes dans les tables ajoutées) et servent à philtrer les Temps pleins, Temps complets, et rajouter si necessaire B et C compte tenu qu'ils sont dans la même colonne de la table de base.
    Elles sont rajoutées dans le QBE(Création en mode graphique de la requête) en même temps que la création et n'existent que là.
    on pourrait aussi faire autant de requête philtre et et joindre à la fin, cela donnerait le même résultat.
    on pourrait aussi extraire par du code VBA, faire des tableaux etc....
    seul le résultat compte....en principe.
    à +

Discussions similaires

  1. Transformer le résultat d'une requête en table
    Par vbhdbms dans le forum Requêtes et SQL.
    Réponses: 20
    Dernier message: 07/10/2014, 12h44
  2. [PHP 5.3] Affichage du résultat d'une requête multi-table sur plusieurs pages
    Par leaston dans le forum Langage
    Réponses: 2
    Dernier message: 20/08/2011, 16h19
  3. [ACCESS] Ajouter un enregistrement dans une requête multi-table
    Par access_balou dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 23/09/2008, 14h43
  4. Transférer les résultats d'un calcul d'une requête à una table
    Par Delfin dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 14/06/2007, 09h11
  5. enregistrer le résultat d'une requête comme table, comment fait-on ?
    Par Monbasinstinct dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/02/2007, 16h21

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