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

Développement SQL Server Discussion :

TOP 10 sur qtés prises dans 2 tables différentes


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Par défaut TOP 10 sur qtés prises dans 2 tables différentes
    Bonjour à tous,

    aujourd'hui je me décide à poster une question sur un problème que j'ai toujours contourné par programmation ne sachant pas le résoudre via une requête plus élaborée.

    J'ai besoin d'établir une sorte de FLOP 10 de mes fournisseurs les plus en retard dans leurs livraisons. A cet effet, je dois interroger 2 types de transactions avec mes fournisseurs: les achats purs, et la sous-traitance.

    J'ai donc 2 tables différentes, toutes 2 ayant une clé étrangère vers un fournisseur.

    Voici un début de requêtage, pour l'instant ça me fait un produit cartésien des 2 tables :

    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 achats.frn_code AS fournisseur, achats.solde AS fsolde, st.frn_code AS soustraitant, st.solde AS stsolde
     
    from 
     
    (select frn_code, sum(cfl_qte_cde - cfl_qte_recue) AS solde
    from cfl
    inner join cf on cfl_cf_id = cf_id
    inner join frn on cf_fournisseur = frn_id
    where cfl_fermee = 0 and cfl_qte_recue < cfl_qte_cde
    AND cfl_delai_fournisseur < '20171108'
    group by frn_code) AS achats,
     
    (select frn_code, sum(os_qte_encours) AS solde
    from os
    inner join frn on os_fournisseur = frn_id
    where os_termine = 0 AND os_qte_encours > 0
    AND os_echeance < '20171108'
    group by frn_code) AS st
    Est-ce que je dois faire séparément chaque requête, mettre dans un "buffer" temporaire, trier, et récupérer le top 10 ?

    Si je peux le faire direct dans une seule et même requête ce serait top...

    Merci d'avance pour tout conseil.

    droliprane

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Principe général :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT TOP 10 *
    FROM
    (
    SELECT ... --> première requête
    UNION ALL
    SELECT ... --> seuxième requête
    ) AS T
    ORDER BY ...
    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/ * * * * *

  3. #3
    Membre éclairé Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Par défaut
    Oui mais ces 2 tables n'ont pas la même structure de champs.

    Admettons que j'ai dans la table achats un champs "reste_a_recevoir", et dans la table sous-traitance un champs "encours"

    Comment une requête pourrait-elle faire un ORDER BY sur 2 champs distincts, mais pas d'abord un puis l'autre

    En gros, il me faudrait un 3ème champs qui soit le max des 2 premiers, et ensuite faire mon tri descendant dessus ?

  4. #4
    Membre éclairé Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Par défaut
    C'est bon j'ai pigé, je m'arrange pour formater le résultats des 2 requêtes pour qu'elles aient les mêmes "alias" et ensuite je trie dessus.

    Voici :

    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
    select TOP 10 * 
     
     from 
     
    ((select frn_code, sum(cfl_qte_cde - cfl_qte_recue) AS solde
    from cfl
    inner join cf on cfl_cf_id = cf_id
    inner join frn on cf_fournisseur = frn_id
    where cfl_fermee = 0 and cfl_qte_recue < cfl_qte_cde
    AND cfl_delai_fournisseur < '20171108'
    group by frn_code)
     
    UNION 
     
    (select frn_code, sum(os_qte_encours) AS solde
    from os
    inner join frn on os_fournisseur = frn_id
    where os_termine = 0 AND os_qte_encours > 0
    AND os_echeance < '20171108'
    group by frn_code)) AS t
     
    ORDER BY t.solde desc

    Merci

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    On n'a pas le modèle, mais on peut toutefois supposer une petite erreur de modélisation : il faudrait probablement un héritage ici :
    une table mère contenant toutes les transactions (avec toutes les colonnes communes aux deux types de transaction)
    deux tables filles, une pour les achats purs, une autre pour la sous-traitance, contenant les données propres à chaque type de transaction.

    La requête aurait alors été plus simple, et surtout plus performante...

  6. #6
    Membre éclairé Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Par défaut
    Bonjour,

    non les données sont très différentes, je ne pouvais pas faire une table commune, d'une transaction à l'autre il y aurait et la moitié des champs inutilisés à chaque fois, j'ai préféré dissocier en 2 tables même si je suis cette fois confronté à ce petit problème. Mais la requête UNION me convient bien.

    Merci

Discussions similaires

  1. [AC-2003] ACCESS requete sur champs inexistant dans une table
    Par marlauc dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 02/12/2011, 10h14
  2. IceFaces : double clic sur une ligne dans une table
    Par sebastiens57 dans le forum JSF
    Réponses: 4
    Dernier message: 13/11/2008, 10h55
  3. Question sur les Filtres dans une table Access
    Par OobiloO dans le forum Bases de données
    Réponses: 1
    Dernier message: 19/05/2008, 12h09
  4. Test evenement sur champ vide dans une table
    Par eddyG dans le forum Access
    Réponses: 3
    Dernier message: 30/05/2006, 17h02
  5. [WD9] Cliquer sur des enregistrements dans une table
    Par oz80 dans le forum WinDev
    Réponses: 2
    Dernier message: 15/12/2005, 20h11

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