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] simplification de requètes.


Sujet :

Langage SQL

  1. #1
    Membre averti Avatar de pmboutteau
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 601
    Points : 420
    Points
    420
    Par défaut [Access] simplification de requètes.
    Voici mon problème. J'ai une table commande et je veux aller chercher les données de 2 autres tables qui sont liées à la table commande.

    Voici ce que je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT c.NumCommande, c.diametre, c.epaisseur, c.TypeDeFiletage, c.grade, c.NomClient, c1.NumCommande, c1.diametre, c1.epaisseur, c1.TypeDeFiletage, c1.grade, c1.NomClient
    FROM Commande AS c INNER JOIN OperationCasing AS o ON c.NumCommande = o.NumCommande, Commande AS c1 INNER JOIN SupervisionCasing AS s ON c1.NumCommande = s.NumCommande
    WHERE (((o.NomPoste) In ('Rec.Agt.Csg')) AND ((o.Poste)='c,Bertaux') AND ((o.DateSaisie) Between #1/1/2006# And #2/1/2006#))
    GROUP BY c.NumCommande, c.diametre, c.epaisseur, c.TypeDeFiletage, c.grade, c.NomClient, c1.NumCommande, c1.diametre, c1.epaisseur, c1.TypeDeFiletage, c1.grade, c1.NomClient, s.DateSaisie, s.Poste, s.NomPoste
    HAVING (((s.DateSaisie) Between #1/1/2006# And #2/1/2006#) AND ((s.Poste)='c,Bertaux') AND ((s.NomPoste) In ('SupQuaCsg')));
    N'y at'il pas plus simple que d'avoir 2 tables commandes c et c1?

    Merci.
    ours ours !! Au début elle est froide mais après elle est bonne!

  2. #2
    Membre actif Avatar de TheRussian
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 200
    Points : 241
    Points
    241
    Par défaut
    Bonjour,

    est-ce normal qu'il n'y ai aucun lien entre les tables OperationCasing et SupervisionCasing, si ce n'est pas le cas la requete devrait être la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT c.NumCommande, c.diametre, c.epaisseur, c.TypeDeFiletage, c.grade, c.NomClient
    FROM Commande AS c 
             INNER JOIN OperationCasing AS o ON c.NumCommande = o.NumCommande
             INNER JOIN SupervisionCasing AS s ON c.NumCommande = s.NumCommande 
    WHERE (((o.NomPoste) In ('Rec.Agt.Csg')) AND ((o.Poste)='c,Bertaux') 
              AND ((o.DateSaisie) Between #1/1/2006# And #2/1/2006#)) 
    GROUP BY c.NumCommande, c.diametre, c.epaisseur, c.TypeDeFiletage, c.grade, c.NomClient, s.DateSaisie, s.Poste, s.NomPoste 
    HAVING (((s.DateSaisie) Between #1/1/2006# And #2/1/2006#) AND ((s.Poste)='c,Bertaux') AND ((s.NomPoste) In ('SupQuaCsg')));

  3. #3
    Membre averti Avatar de pmboutteau
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 601
    Points : 420
    Points
    420
    Par défaut
    Ben le lien ce serait le numéro de commande.

    Je vais essayer ta requète.
    ours ours !! Au début elle est froide mais après elle est bonne!

  4. #4
    Membre averti Avatar de pmboutteau
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 601
    Points : 420
    Points
    420
    Par défaut
    Je vais développer.

    J'ai une table commande qui stocke les données d'une commande.

    Ensuite j'ai 2 autres tables qui stockent des travaux réalisés sur les commandes.

    C'est 2 tables ont pour clés primaires, un t-uples, (Numcommande,DateDeSaisie,Poste,NomPoste)

    Je veux récupérer pour un poste et un nomposte donnés toutes les commandes avec leurs caractéristiques entre 2 dates données.

    voilà en gros le sujet.


    voici ce que j'ai pour l'instant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT c.NumCommande, c.diametre, c.epaisseur, c.TypeDeFiletage, c.grade, c.NomClient,c1.NumCommande, c1.diametre, c1.epaisseur, c1.TypeDeFiletage, c1.grade, c1.NomClient,o.BoutsTraites/2 As Recette,o.BoutsBons/2 As RebutAgent,s.Supervise,s.NC
    FROM Commande AS c INNER JOIN OperationCasing AS o ON c.NumCommande = o.NumCommande, Commande As c1  INNER JOIN SupervisionCasing As s ON c1.NumCommande = s.NumCommande
    WHERE (((o.NomPoste) In ('Rec.Agt.Csg')) AND ((o.Poste)='c,Bertaux') AND ((o.DateSaisie) Between #1/1/2006# And #2/1/2006#)) AND  (((s.DateSaisie) Between #1/1/2006# And #2/1/2006#) AND ((s.Poste)='c,Bertaux') AND ((s.NomPoste) In ('SupQuaCsg')));
    ours ours !! Au début elle est froide mais après elle est bonne!

  5. #5
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Tout cela me paraît bien confus :
    • 1) Pourquoi deux copies de la table commande
      2) Pour un GROUP BY sans fonction agrégative
      3) Pourquoi des conditions dans le HAVING qui pourraient être dans le WHERE
      4) Pourquoi un monstrueux produit cartésien ?


    Peux-tu décrire ton problème fonctionnellement.

    Telle que je comprends la requête, elle ne sert qu'à sélectionner des commandes en fonctions de contraintes sur les autres tables, si c'est le cas, un EXISTS devrait mieux répondre au problème.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  6. #6
    Membre averti Avatar de pmboutteau
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 601
    Points : 420
    Points
    420
    Par défaut
    J'explique un peu au-dessus. Tu as du répondre pendant que j'éditais. En effet le having et le group by je les ai virés.

    pour les 2 copies de la table commande,c'est tout ce que j'ai trouvé pour l'instant pour passer la difficulté mais ce n'est pas très concluant
    ours ours !! Au début elle est froide mais après elle est bonne!

  7. #7
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Après lecture de ta description, je ferais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT c.*
    FROM Commande c INNER JOIN (SELECT NumCommande
                                FROM OperationCasing
                                WHERE NomPoste In ('Rec.Agt.Csg') 
                                  AND Poste = 'c,Bertaux' 
                                  AND DateSaisie Between #1/1/2006# And #2/1/2006#
                               UNION
                                SELECT NumCommande
                                FROM SupervisionCasing
                                WHERE NomPoste In ('SupQuaCsg') 
                                  AND Poste = 'c,Bertaux' 
                                  AND DateSaisie Between #1/1/2006# And #2/1/2006#) AS a
                     ON a.NumCommande = c.NumCommande
    Je ne suis pas certain que tes IN soient judicieux (soit il manque des apostrophes, soit un = suffirait)
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  8. #8
    Membre actif Avatar de TheRussian
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 200
    Points : 241
    Points
    241
    Par défaut
    Si il peut y avoir des actions sur les ommandes dans la table SupervisionCasing et pas dans OperationCasing, je pense qu'il vaut mieux utiliser les jointures externes avec un LEFT JOIN, RIGHT JOIN.

    Je ne comprends pas l'utiliter de 2 tables Commande dans le FROM :

  9. #9
    Membre averti Avatar de pmboutteau
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 601
    Points : 420
    Points
    420
    Par défaut
    J'ai plus de chose dans les IN mais c'était pour pas avoir trop de code.
    JE vais essayer ton code.

    Merci.
    ours ours !! Au début elle est froide mais après elle est bonne!

  10. #10
    Membre averti Avatar de pmboutteau
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 601
    Points : 420
    Points
    420
    Par défaut
    Seulement dans l'union il me faut le même nombre de champs

    hors dans supervision je vien cherhcer 2 valeurs et 3 dans opération.
    ours ours !! Au début elle est froide mais après elle est bonne!

  11. #11
    Membre averti Avatar de pmboutteau
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 601
    Points : 420
    Points
    420
    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
    SELECT  c.NumCommande, c.diametre, c.epaisseur, c.TypeDeFiletage, c.grade, c.NomClient,SUM(a.BoutsTraites)/2 As Tubes
    FROM Commande AS c INNER JOIN [SELECT NumCommande,BoutsTraites
                                FROM OperationCasing
                                WHERE NomPoste In ('Rec.Agt.Csg')
                                  AND Poste = 'c,Bertaux'
                                  AND DateSaisie Between #1/1/2006# And #2/1/2006#
                               UNION
                                SELECT NumCommande,Supervise
                                FROM SupervisionCasing
                                WHERE NomPoste In ('SupQuaCsg')
                                  AND Poste = 'c,Bertaux'
                                  AND DateSaisie Between #1/1/2006# And #2/1/2006#]. AS a ON c.NumCommande = a.NumCommande GROUP BY c.NumCommande, c.diametre, c.epaisseur, c.TypeDeFiletage, c.grade, c.NomClient;
    Bouts traites et Supervise sont différents pour moi je les veux tous les 2.
    Là il me fait la somme des 2.

    Comment éviter le Union?
    ours ours !! Au début elle est froide mais après elle est bonne!

  12. #12
    Membre averti Avatar de pmboutteau
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 601
    Points : 420
    Points
    420
    Par défaut
    J'ai essayé çà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT c.NumCommande, c.diametre, c.epaisseur, c.TypeDeFiletage, c.grade, c.NomClient, SUM(a.Tube) AS Tubes,SUM(a.Process) AS Supervise
    FROM Commande AS c INNER JOIN (SELECT  (o.NumCommande) as op,(s.NumCommande) as super,Sum(o.BoutsTraites)/2 as Tube,Sum(s.Supervise)/2 as Process
                                FROM OperationCasing AS o INNER JOIN SupervisionCasing AS s ON s.Poste=o.Poste
                                WHERE( (o.NomPoste In ('Rec.Agt.Csg')
                                  AND o.Poste = 'c,Bertaux'
                                  AND o.DateSaisie Between #1/1/2006# And #2/1/2006#) AND (s.NomPoste In ('SupQuaCsg')  AND s.Poste = 'c,Bertaux' AND s.DateSaisie Between #1/1/2006# And #2/1/2006#)) Group BY o.NumCommande,s.NumCommande) AS a ON (c.NumCommande = a.op OR c.NumCommande=a.super)
    GROUP BY c.NumCommande, c.diametre, c.epaisseur, c.TypeDeFiletage, c.grade, c.NomClient;
    Seulement là j'ai des doublons dans mes additions!
    ours ours !! Au début elle est froide mais après elle est bonne!

  13. #13
    Membre averti Avatar de pmboutteau
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 601
    Points : 420
    Points
    420
    Par défaut
    voici les 2 requètes bonnes séparées. Je voudrais les lier.

    requète1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT c.NumCommande,c.diametre,c.epaisseur,c.TypeDeFiletage,c.Grade,c.NomClient,Sum(o.BoutsTraites)/2 AS TubesTraites,Sum(o.Rebuts) As RebutsAgent FROM Commande as c Inner Join OperationCasing as o ON c.NumCommande=o.NumCommande WHERE o.Poste='C,Bertaux'  AND O.NomPoste='Rec.Agt.Csg' AND o.DateSaisie BETWEEN #1/1/2006# AND #2/1/2006# Group by c.NumCommande,c.diametre,c.epaisseur,c.TypeDeFiletage,c.Grade,c.NomClient ;

    requète2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT c.NumCommande,c.diametre,c.epaisseur,c.TypeDeFiletage,c.Grade,c.NomClient,Sum(o.Supervise) AS TubesSup,Sum(o.NC) As TubesNC FROM Commande as c Inner Join SupervisionCasing as o ON c.NumCommande=o.NumCommande WHERE o.Poste='C,Bertaux'  AND O.NomPoste='SupQuaCsg' AND o.DateSaisie BETWEEN #1/1/2006# AND #2/1/2006# Group by c.NumCommande,c.diametre,c.epaisseur,c.TypeDeFiletage,c.Grade,c.NomClient ;
    ours ours !! Au début elle est froide mais après elle est bonne!

  14. #14
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Essaye :
    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
    SELECT c.NumCommande, c.diametre, c.epaisseur, c.TypeDeFiletage, c.Grade, c.NomClient,
           Sum(BoutsTraites)/2 AS TubesTraites,
           Sum(Rebuts)         AS RebutsAgent,
           Sum(Supervise)      AS TubesSup,
           Sum(NC)             AS TubesNC         
    FROM Commande c INNER JOIN (SELECT NumCommande, BoutsTraites, Rebuts, 0 AS Supervise, 0 AS nc
                                FROM OperationCasing 
                                WHERE NomPoste In ('Rec.Agt.Csg') 
                                  AND Poste = 'c,Bertaux' 
                                  AND DateSaisie Between #1/1/2006# And #2/1/2006# 
                               UNION ALL
                                SELECT NumCommande, 0, 0, Supervise, nc 
                                FROM SupervisionCasing 
                                WHERE NomPoste In ('SupQuaCsg') 
                                  AND Poste = 'c,Bertaux' 
                                  AND DateSaisie Between #1/1/2006# And #2/1/2006#) AS a 
                     ON a.NumCommande = c.NumCommande
    GROUP BY c.NumCommande, c.diametre, c.epaisseur, c.TypeDeFiletage, c.Grade, c.NomClient
    Au point de vue performance tu peux essayer en mettant des SUM et des GROUP BY dans les requêtes de l'UNION
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  15. #15
    Membre averti Avatar de pmboutteau
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 601
    Points : 420
    Points
    420
    Par défaut
    Merci çà marche nickel. Je savais qu'on pouvais faire ce genre de manip avec le 0. C'est assez intéressant.
    ours ours !! Au début elle est froide mais après elle est bonne!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/02/2006, 18h58
  2. [Access] Probléme de requête
    Par Striker96 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 03/02/2006, 16h38
  3. [Access] Optimisation performance requête - Index
    Par fdraven dans le forum Access
    Réponses: 11
    Dernier message: 12/08/2005, 14h30
  4. [ADO/Access] Appel d’une requête avec des paramètres
    Par Taxenna dans le forum Bases de données
    Réponses: 1
    Dernier message: 07/12/2004, 14h58
  5. Réponses: 3
    Dernier message: 11/10/2004, 17h26

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