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 :

Utiliser deux sommes dans un select


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut Utiliser deux sommes dans un select
    Bonjour,

    Je cherche à faire une requête qui va me retourner le stock d'un quelconque article sur deux bases de données se trouvant sur deux serveurs différents.

    Les deux bases de données ont la même structure et chaque article est référencé de la même manière dans les deux bases.

    Je pensais à une requête comme celle ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT DB1.REF_ART, SUM(DB1.QTE) STOCKDB1, SUM(DB2.QTE) STOCKDB2, SUM(DB1.QTE) + SUM(DB2.QTE) 'TOTAL'
    FROM DB1.DBO.TARTICLE DB1, SERVEURLIE.DB2.TARTICLE DB2
    WHERE DB2.REF_ART = DB1.REF_ART
    ...
    mais je ne suis pas sur de ça.

    Merci,

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Hello,

    Par exemple :

    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
    WITH DB1
    AS
    (
     SELECT 
      REF_ART, 
      SUM(QTE) AS STOCKDB1
     FROM DB1.DBO.TARTICLE 
     WHERE REF_ART = '<ref_art>'
     GROUP BY REF_ART
    ),
    DB2
    (
     SELECT 
      REF_ART, 
      SUM(QTE) AS STOCKDB2
     FROM SERVEURLIE.DB2..TARTICLE 
     WHERE REF_ART = '<ref_art>'
     GROUP BY REF_ART
    )
    SELECT 
     DB1.REF_ART, 
     DB1.STOCKDB1, 
     DB2.STOCKDB2, 
     DB1.STOCKDB1) + DB2.STOCKDB2
    FROM DB1
     JOIN DB2
      ON DB1.REF_ART = DB2.REF_ART
    ++

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Si vous avez plus d'une ligne par référence article vous allez créer un simili produit cartésien.
    Faites plutôt comme ceci :
    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
    With SR_DB1 (REF_ART, STOCKDB1) AS
    (
      SELECT DB1.REF_ART, SUM(DB1.QTE) as STOCKDB1
        FROM DB1.DBO.TARTICLE as DB1, SERVEURLIE.DB2.TARTICLE DB2
    GROUP BY DB1.REF_ART
    )
      ,  SR_DB2 (REF_ART, STOCKDB2) AS
    (
      SELECT DB2.REF_ART, SUM(DB2.QTE) as STOCKDB2
        FROM SERVEURLIE.DB2.TARTICLE as DB2
    GROUP BY DB2.REF_ART
    )
      ,  SR_DB (REF_ART, STOCKDB1, STOCKDB2) AS
    (
    SELECT REF_ART, STOCKDB1, 0 FROM SR_DB1
     UNION ALL
    SELECT REF_ART, 0, STOCKDB2 FROM SR_DB2
    )  
      SELECT REF_ART, SUM(STOCKDB1) as STOCKDB1, SUM(STOCKDB2) as STOCKDB2
           , SUM(STOCKDB1) + SUM(STOCKDB2) as Total
        FROM SR_DB
    GROUP BY REF_ART;

  4. #4
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    J'ai essayé de faire un truc comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DB1_AR.REF_ART, FLOOR(SUM(DB1_TD.QTE)) STOCKDB1,
    (SELECT FLOOR(SUM(DB2_TD.QTE))
    FROM [SRVLIE].[DB2].DBO.TDETAILS AS DB2_TD
    WHERE DB2_TD.REF_ART = DB1_TD.REF_ART COLLATE FRENCH_CI_AS 
    AND DB2_TD.NO = 2
    ) STOCKDB2
    FROM [DB1].DBO.TARTICLE DB1_AR, [DB1].DBO.TDETAILS DB1_TD
    WHERE DB1_TD.REF_ART = DB1_AR.REF_ART
    AND DB1_TD.REF_ART = 'ref article'
    GROUP BY DB1_AR.REF_ART
    mais j'ai le message d'erreur suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La colonne 'DB2.DBO.TDETAILS.REF_ART' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.
    Je ne comprends pas très bien la clause WITH et ma requête, je voudrais l'utiliser pour remplir une datagridview en c#.

  5. #5
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Normal que tu aies cette erreur.
    Tu utilises une colonne dans ta sous requête corrélée qui n'est pas comprise dans ton regroupement globale. Il faut remplacer DB1_TD.REF_ART par DB1_AR.REF_ART.

    Je ne comprends pas ta clause supplémentaire dans ta sous requête AND DB2_TD.NO = 2. En principe tu devrais pouvoir retrouver le bon article avec ta jointure ?? !!

    De plus je pense que tu devrais éviter les sous requêtes corrélées qui peuvent être contre performantes. Pour chaque ligne de ta requête parente tu auras une exécution de ta requête corrélée ...

    ++

  6. #6
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    DB2_TD.NO = 2 est une condition qui est nécessaire dans ma sous requête corrélée.

    Sinon comment pourrais-je modifier ma requête pour qu'elle soit plus performante?

  7. #7
    Membre habitué Avatar de cynferdd
    Profil pro
    Analyste Développeur .Net, PHP, SQL Server
    Inscrit en
    Avril 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Développeur .Net, PHP, SQL Server

    Informations forums :
    Inscription : Avril 2003
    Messages : 154
    Points : 190
    Points
    190
    Par défaut
    J'ai modifié un peu la dernière requête comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT DB1_AR.REF_ART, 
    	   FLOOR(SUM(DB1_TD.QTE)) STOCKDB1,
           FLOOR(SUM(DB2_TD.QTE)) STOCKDB2,
    FROM [DB1].DBO.TARTICLE DB1_AR
    INNER JOIN [DB1].DBO.TDETAILS DB1_TD ON DB1_TD.REF_ART = DB1_AR.REF_ART
    INNER JOIN [SRVLIE].[DB2].DBO.TDETAILS AS DB2_TD ON DB2_TD.REF_ART = DB1_TD.REF_ART COLLATE FRENCH_CI_AS AND DB2_TD.NO = 2
    WHERE 
    DB1_TD.REF_ART = 'ref article'
    GROUP BY DB1_AR.REF_ART
    Peut être que ça conviendra mieux.
    A noter que j'ai mis ici des inner join, mais au besoin ça peut aussi bien être changé par des Left outer join suivant les résultats attendus et la façon dont les données sont structurées.

    Est ce que ça correspond aux besoins et les résultats retournés sont-ils cohérents?
    A faire et à défaire on finit par ne plus rien faire.

  8. #8
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Merci d'avoir essayé mais c'est loin du résultat que j'attends.

    Ma requête ci-dessous fonctionne correctement:

    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 DB1_AR.REF_ART, ISNULL(FLOOR(SUM(DB1_TD.QTE)), 0) STOCKDB1,
    (SELECT ISNULL(FLOOR(SUM(DB2_TD.QTE)), 0)
    FROM [SRVLIE].[DB2].DBO.TDETAILS AS DB2_TD
    WHERE DB2_TD.REF_ART = DB1_TD.REF_ART COLLATE FRENCH_CI_AS
    AND DB2_TD.NO = 2
    ) AS STOCKDB2, (SELECT ISNULL(FLOOR(SUM(DB2_TD.QTE)), 0) + ISNULL(FLOOR(SUM(DB1_TD.QTE)), 0)
    FROM [SRVLIE].[DB2].DBO.TDETAILS AS DB2_TD
    WHERE DB2_TD.REF_ART = DB1_TD.REF_ART COLLATE FRENCH_CI_AS 
    AND DB2_TD.NO = 2
    ) AS TOTAL
    FROM [DB1].DBO.TARTICLE DB1_AR, [DB1].DBO.TDETAILS DB1_TD
    WHERE DB1_TD.REF_ART = DB1_AR.REF_ART
    AND DB1_AR.CODEFAMART = 'AA'
    AND DB1_TD.REF_ART = 'ref article'
    GROUP BY DB1_AR.REF_ART
    cependant, j'aurais préféré utiliser une autre méthode plutôt que des sous requêtes corrélées.

Discussions similaires

  1. utiliser deux couleurs dans un formulaire
    Par radahm dans le forum IHM
    Réponses: 1
    Dernier message: 05/03/2009, 12h11
  2. ecrire deux listes dans un select
    Par rherrad dans le forum Struts 1
    Réponses: 35
    Dernier message: 26/07/2007, 15h18
  3. [PL/SQL] utilisation de variables dans un select?
    Par Dr Kraft dans le forum SQL
    Réponses: 8
    Dernier message: 11/10/2006, 10h17
  4. Utiliser deux bases dans une requete, possible ?
    Par compu dans le forum Requêtes
    Réponses: 2
    Dernier message: 20/02/2006, 14h09
  5. afficher les champs null de deux tables dans un select
    Par poil dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/09/2005, 15h05

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