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

MS SQL Server Discussion :

Besoin d'aide pour une requete


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 55
    Par défaut Besoin d'aide pour une requete
    Bonjour,

    pour que mes explications soient plus claires, j'ai joint le schema des tables qui concernent ma requete.

    Je veux recuperer le champ 'minQty' dans la table RO correspondant à la table dont le champ 'niveau' a la plus grande valeur parmi les 4 tables Groupe, Pole, instrument, InstrumentG.

    Voila l'idée generale :

    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
     
    SELECT minqty
    FROM   regles_ordres ro
    WHERE  ro.id_ro IN (SELECT id_ro#
                        FROM   ---- ? ----
                        WHERE  niveau IN (SELECT MAX(ig.niveau,i.niveau,g.niveau,p.niveau)
                                          FROM   instrumentg ig,
                                                 instrument i,
                                                 groupe g,
                                                 pole p,
                                                 regles_ordres ro
                                          WHERE  (ig.id_instrumentg = i.id_instrumentg#)
                                                 AND (i.id_groupe# = g.id_groupe)
                                                 AND (g.id_pole# = p.id_pole)
                                                 AND (ro.id_ro = i.id_ro#)))
    C'est une ébauche de requete. Je sais que max ne marche que pour un champ/une colonne et c'est pour ca que j'ai besoin de votre aide.

    Si vous avez une solution (procedure stockée avec curseur et boucle for pour trouver le max, etc), je suis preneuse.
    N'hesitez pas à demander plus d'infos car je suis bloquée.

    Merci
    Images attachées Images attachées  

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 227
    Billets dans le blog
    25
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select max(id_RO#) id, niveau into #t from Pole
    insert into #t select max(id_RO#), niveau from Groupe
    insert into #t select max(id_RO#), niveau from Intrument
    insert into #t select max(id_RO#), niveau from InstrumentG
     
    delete #t where niveau < (select max(niveau) from #t)
     
    select minQty
    from RO inner join #t on RO.id_RO=#t.id
     
    drop table #t
    Au cas où vous auriez plusieurs max(niveau) dans els tables, vous risquez de vous retrouver avec plusieurs lignes !
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 55
    Par défaut
    merci pour la rapidité
    je teste tout de suite

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 55
    Par défaut
    J'obtiens une erreur :

    Serveur*: Msg 8118, Niveau 16, État 1, Ligne 1
    La colonne 'Pole.niveau' est incorrecte dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation et qu'il n'y a pas de clause GROUP BY.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 982
    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 982
    Billets dans le blog
    6
    Par défaut
    Démonstration en une 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    -- le niveau max des 4 tables
    SELECT MAX(niveau) AS MAX Niveau
    FROM   (SELECT niveau
            FROM InstrumentG
            UNION
            SELECT niveau
            FROM Instrument
            UNION
            SELECT niveau
            FROM Groupe
            UNION
            SELECT niveau
            FROM Pole) T
     
    -- Le idRO associé au maxNiveau
    SELECT id_Ro
    FROM   (SELECT id_Ro, niveau
            FROM InstrumentG
            UNION
            SELECT id_Ro, niveau
            FROM Instrument
            UNION
            SELECT id_Ro, niveau
            FROM Groupe
            UNION
            SELECT id_Ro, niveau
            FROM Pole) TT
    WHERE niveau = (SELECT MAX(niveau) AS MAX Niveau
                    FROM   (SELECT niveau
                            FROM InstrumentG
                            UNION
                            SELECT niveau
                            FROM Instrument
                            UNION
                            SELECT niveau
                            FROM Groupe
                            UNION
                            SELECT niveau
                            FROM Pole) T )
     
    -- le min qty associé au idRo
    SELECT minQty
    FROM   RO
    WHERE  id_RO = SELECT id_Ro
                   FROM   (SELECT id_Ro, niveau
                           FROM InstrumentG
                           UNION
                           SELECT id_Ro, niveau
                           FROM Instrument
                           UNION
                           SELECT id_Ro, niveau
                           FROM Groupe
                           UNION
                           SELECT id_Ro, niveau
                           FROM Pole) TT
                   WHERE niveau = (SELECT MAX(niveau) AS MAX Niveau
                                   FROM   (SELECT niveau
                                           FROM InstrumentG
                                           UNION
                                           SELECT niveau
                                           FROM Instrument
                                           UNION
                                           SELECT niveau
                                           FROM Groupe
                                           UNION
                                           SELECT niveau
                                           FROM Pole) T )
    Il aurait été plus intelligent de poster la définition SQL de vos requêtes telle que précisé dans ce post : http://www.developpez.net/forums/showthread.php?t=944

    Enfin, votre architecture de tables est très mauvaise. La conception de votre base est particulièrement anormale. Vous auriez du faire un héritage de table pour les 4 tables de niveau supérieur ou alors l'idée de nommer vos colonne avec le même vocable est particulièrement stupide !
    Dans tous les cas, des performances exécrables en matière de requête seront à attendre.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 55
    Par défaut
    Voila, j'ai corrigé l'affichage de la requete qui est maintenant formatée.
    Par contre, il est trop tard pour que je puisse modifier le nom des champs.

    En ce qui concerne ma requete, apparemment je me suis mal exprimé.

    Pour chaque quadruplet (Groupe.niveau, Pole.niveau, instrument.niveau, InstrumentG.niveau), je veux recuperer le champ 'minQty' dans la table RO correspondant à la table dont le champ 'niveau' a la plus grande valeur dans le quadruplet.

    Quant à la remarque de fadace, je fais les verifications necessaires auparavant pour qu'il n'y ait qu'un seul max par quadruplet. Pas de souci donc de ce coté la.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 55
    Par défaut
    Bonjour

    J'insiste de nouveau.
    Y a-t-il quelqu'un pour m'aider à faire ma requete ?

    merci

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Par défaut
    Bizarre, il me semble que la dernière requete postée par SQLPRO convient dans ce que tu veux faire.

    Y'a d'autre façon de le faire mais celle de SQLPRO doit marcher parfaitement.
    Je te conseille de nous donner un exemple numérique pour qu'on visionne ce que tu souhaites

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 55
    Par défaut
    Ok

    j'ai testé la requete de SQLPro.
    Sa requete renvoie le max de l'UNION des 4 tables.
    C'est un max global sur l'ensemble de toutes les valeurs du champ niveau des 4 tables. Grossierement, on met tout dans un meme sac et on en sort le max.

    La requete dont j'ai besoin doit renvoyer un minQty correspondant au champ niveau qui est le max pour le quadruplet.

    C'est pour ca que dans mon 1er poste je parle de procedure stockée avec curseur et boucle for pour trouver le max et que j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WHERE  (ig.id_instrumentg = i.id_instrumentg#)
                AND (i.id_groupe# = g.id_groupe)
                AND (g.id_pole# = p.id_pole)
                AND (ro.id_ro = i.id_ro#)
    Certainement qu'il y a d'autres façons.

    Il y a plusieurs quadruplets, donc un max(niveau) pour chaque quadruplet, donc un minQty pour chaque max(niveau).

    La requete de SQLPro ne renvoie toujours qu'une seule ligne quel que soit le nombre de quadruplets puisqu'il se base sur l'union des 4 tables.

    Je vais essayer de preparer un exemple avec des valeurs

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Par défaut
    Citation Envoyé par elitol
    Je vais essayer de preparer un exemple avec des valeurs
    Préférable en effet

Discussions similaires

  1. Besoin d'aide pour une requete
    Par fabris dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/04/2006, 20h15
  2. Besoin d'aide pour une requete SQL
    Par fabris dans le forum Requêtes
    Réponses: 6
    Dernier message: 10/04/2006, 20h27
  3. besoin d'aide pour une requete
    Par Pigoulou dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/02/2006, 20h34
  4. Besoin d'aide pour une requete
    Par Okhotsk dans le forum Langage SQL
    Réponses: 3
    Dernier message: 02/11/2005, 16h30
  5. Besoin d'aide pour une requete
    Par jnc dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/07/2005, 11h54

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