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 :

deux requetes ensemble


Sujet :

Langage SQL

  1. #1
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 27
    Par défaut deux requetes ensemble
    bonjour à tous .

    j'aimerais bien faire un reporting sur mon activité commercial j'ai donc creé deux requettes une sur les commande client et une sur la facturation

    voici celle des commandes (elle fonctionne bien ).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT  T1.docdate, sum(T1.GrosProfit)AS [montant commandé]
    FROM ORDR
    GROUP BY  T1.Docdate
    voici celle des factures (elle fonctionne bien aussi )

    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT T2.Docdate , sum(T2.GrosProfit)AS [montant facturé] 
    FROM OINV T2 
    GROUP BY T2.DocDate
    mon besion serais d'avoir l'affichage sur un seul tableau j'ai donc tester differente solution mai j'avoue que je n'y arrive pas et cherche sur le net des solution mais soit je n'arrive pas a mon resulta soit cela ne fonctionne pas
    je pense me rapprocher du but avec un jionture "FULL" mais le problem est que mais totaux ne sont plus bon du tous les fonction sum me donne n'importe quoi comme resulta .

    voici la requete avec la jointure FULL (c'est la seul qui me permet d'avoir l'affichage des date des commandes et des dates de factures car il y à des jours ou l'on passe des commandes et ou l'on ne facture pas et parfois l'inverse.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT  T1.docdate AS [date de commande], T2.docdate AS [date de facture],
    isnull (sum(T1.GrosProfit),0) AS [montant commandé],
    isnull (sum(T2.GrosProfit),0) AS [montant facturé] 
    FROM ORDR T1 full JOIN OINV T2 ON T1.docdate = t2.docdate
    GROUP BY  T1.Docdate, T2.docdate
    ORDER BY T1.Docdate
    merci de votre aide

    je suis sur une base SQL server 2005

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vous êtes effectivement dans la bonne voie.
    Je vous conseille de passer par deux sous-requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT
        coalesce(f.docdate, c.docdate) as docdate,
        coalesce(c.montant_c, 0) as montant_commandes,
        coalesce(f.montant_f, 0) as montant_factures
    FROM
        (SELECT docdate, sum(GrosProfit) AS montant_c
         FROM ORDR GROUP BY docdate) AS c
        FULL OUTER JOIN 
        (SELECT docdate, sum(GrosProfit) AS montant_f
         FROM OINV GROUP BY docdate) AS f
          ON c.docdate = f.docdate
    ORDER BY
        coalesce(f.docdate, c.docdate) ASC
    coalesce est une fonction de la norme SQL qui remplace le isnull de SQL Server et qui l'étend à n arguments

  3. #3
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 27
    Par défaut ENCORE MERCI WALDAR !!!!!!
    Et bien c'est toujours toi qui me donne la solution .

    Un grand merci

    je commance à comprendre cette nouvelle fonction que tu ma montré hier

  4. #4
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 27
    Par défaut ajouter une selection de date
    maintanant je voudrais pouvoir ajouter une possibilité de choisir d'afficher les resultat juste sur le moi avril par exemple .
    j'ai tester cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT
        coalesce(f.docdate, c.docdate) AS docdate,
        coalesce(c.montant_c, 0) AS montant_commandes,
        coalesce(f.montant_f, 0) AS montant_factures
    FROM
        (SELECT docdate, sum(GrosProfit) AS montant_c
         FROM ORDR GROUP BY docdate With Rollup) AS c  
        FULL OUTER JOIN 
        (SELECT docdate, sum(GrosProfit) AS montant_f
         FROM OINV GROUP BY docdate With Rollup ) AS f  
          ON c.docdate = f.docdate
    WHERE c.docdate BETWEEN 09/04/01 And 09/04/30
    ORDER BY
        coalesce(f.docdate, c.docdate) ASC
    il n'y aucun resulta qui s'affiche et pas de message d'erreur

    merci a vous si vous avez une idée

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Le mieux ça reste de filtrer dans les deux sous-requêtes.
    Par contre, on compare des dates avec des dates :
    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
    SELECT
        coalesce(f.docdate, c.docdate) AS docdate,
        coalesce(c.montant_c, 0) AS montant_commandes,
        coalesce(f.montant_f, 0) AS montant_factures
    FROM
        (SELECT docdate, sum(GrosProfit) AS montant_c
         FROM ORDR
         WHERE docdate >= cast('04/01/2009' as datetime)
         AND docdate < cast('05/01/2009' as datetime)
         GROUP BY docdate WITH Rollup) AS c  
        FULL OUTER JOIN 
        (SELECT docdate, sum(GrosProfit) AS montant_f
         FROM OINV
         WHERE docdate >= cast('04/01/2009' as datetime)
         AND docdate < cast('05/01/2009' as datetime)
         GROUP BY docdate WITH Rollup ) AS f  
          ON c.docdate = f.docdate
    ORDER BY
        coalesce(f.docdate, c.docdate) ASC
    Attention le format de la chaîne à caster dépend de la langue de votre SGBD.

  6. #6
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 27
    Par défaut merci
    sinon je viens de réussir avec plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT
        coalesce(f.docdate, c.docdate) AS docdate,
        coalesce(c.montant_c, 0) AS montant_commandes,
        coalesce(f.montant_f, 0) AS montant_factures
    FROM
        (SELECT docdate, sum(GrosProfit) AS montant_c
         FROM ORDR GROUP BY docdate With Rollup) AS c  
        FULL OUTER JOIN 
        (SELECT docdate, sum(GrosProfit) AS montant_f
         FROM OINV GROUP BY docdate With Rollup ) AS f  
          ON c.docdate = f.docdate
    WHERE  c.docdate BETWEEN '04-01-09' and '08-04-09'
    ORDER BY
        coalesce(f.docdate, c.docdate) ASC
    qu'elle est la difference avec votre synthaxe la mienne doit créé des erreurs

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Votre requête va calculer les montants commandés et facturés de toutes les dates (donc toute la table), puis filtrer "au-dessus" la période qui vous intéresse.

    Celle que je vous ai proposée ne calcule les montants commandés et facturés que sur la période qui vous intéresse.

    Au niveau des formats, SQL Serveur va faire une conversion implicite de '04-01-09' en premier avril 2009.

    Je me cite moi-même :
    Si dans la rue vous demandez à un passant l'heure et que celui-ci vous répond "mille quatre cent trente-sept", vous pourrez certes comprendre mais il vous faudra faire la conversion.

    Est-ce que fondamentalement c'est mal ? Oui et non.
    Les conversions implicites existent (à mon sens) pour faciliter le travail de personnes à faible expertise et pour permettre à une requête légèrement fausse de néanmoins s'exécuter.
    Si un utilisateur final fait une conversion implicite sous Access, ce n'est pas très grave tant qu'il a son résultat.

    Mais en tant que développeur il faut il faut il faut utiliser les bons types de données, c'est ainsi qu'on fait du bon code, qu'on progresse, et qu'on évite des erreurs engendrées par les conversions implicites.

  8. #8
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 27
    Par défaut merci
    merci c'est tres gentil a vous de m'expliquer comme vous l'avez certainement compris je ne suis pas develloppeur de formation je m'occupe juste de la mise en place d'un erp au sein de mon entreprise

    j'ai donc repris votre requete je l'ai juste modifier un toutr petit peu pour que cela fonctionne avec sql server 2005 et SAP cela me donne sa :
    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
    SELECT
        coalesce(f.docdate, c.docdate) AS docdate,
        coalesce(c.montant_c, 0) AS montant_commandes,
        coalesce(f.montant_f, 0) AS montant_factures
    FROM
        (SELECT docdate, sum(GrosProfit) AS montant_c
         FROM ORDR
         WHERE docdate >=  cast('04/01/2009' AS datetime)
         AND docdate <  cast('05/01/2009' AS datetime)
         GROUP BY docdate WITH Rollup) AS c  
        FULL OUTER JOIN 
        (SELECT docdate, sum(GrosProfit) AS montant_f
         FROM OINV
         WHERE docdate >=  cast('04/01/2009' AS datetime)
         AND docdate <  cast('05/01/2009' AS datetime)
         GROUP BY docdate WITH Rollup ) AS f  
          ON c.docdate = f.docdate
    ORDER BY
        coalesce(f.docdate, c.docdate) ASC
    j'ai juste enlever les selects devant chaque date (sql server n'acceptait pas )
    mais est ce que cela est bon ou fallais t'il corrigé autre chose car la j'ai le bon resulat .

    merci de m'aider c'est tres gentil de votre part cela me permet de progresser .

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par nemo27 Voir le message
    j'ai juste enlever les selects devant chaque date (sql server n'acceptait pas)
    Et vous avez bien fait car c'était une grossière erreur de copier / coller !

    Pour votre requête j'utiliserai grouping pour bien identifier les sous-totaux.
    Mais je vous laisse chercher !

  10. #10
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 27
    Par défaut encore une tite question
    voila j'ai voulu rajouter des donnée dans ma requete pour une des donnée "slpcode" pas de problem (je pense que c'est parceque le champ est numérique
    par contre j'ai voulu rajouté dans le select le champ cardcode ou cardname mais celui si doit etre de format texte
    et du coup sql server me renvoie la phrase suivante

    "Msg 241, Level 16, State 1, Line 1
    Conversion failed when converting datetime from character string."

    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
    SELECT
    	coalesce (f.Cardcode , c.cardcode) AS cardcode, 
        coalesce(f.slpcode , c.slpcode) AS slpcode,
        coalesce(f.docdate, c.docdate) AS docdate,
        coalesce(c.montant_c, 0) AS montant_commandes,
        coalesce(f.montant_f, 0) AS montant_factures
    FROM
        (SELECT cardcode , slpcode , docdate, sum(GrosProfit) AS montant_c
         FROM ORDR
         WHERE docdate >=  cast('04/01/2009' AS datetime)
         AND docdate <  cast('05/01/2009' AS datetime)
         GROUP BY cardcode , slpcode , docdate WITH Rollup) AS c  
        FULL OUTER JOIN 
        (SELECT cardcode , slpcode , docdate, sum(GrosProfit) AS montant_f
         FROM OINV
         WHERE docdate >=  cast('04/01/2009' AS datetime)
         AND docdate <  cast('05/01/2009' AS datetime)
         GROUP BY cardcode ,slpcode , docdate WITH Rollup ) AS f  
          ON c.docdate = f.docdate
    ORDER BY
        coalesce(f.docdate, c.docdate ,f.slpcode , c.slpcode,f.Cardcode , c.cardcode ) ASC
    comment puis je faire pour le convertir . apres je m'attaque au grouping

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Les coalescences de votre select sont correctes, mais dans le order by ça a déraillé.

  12. #12
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Essayer de trouver la syntaxe ainsi que l'utilité du COALESCE, car utilisé tel quel dans votre clause WHERE , la syntaxe est incorrecte.

    Le fait de mettre les COALESCE dans le SELECT de votre requete vous obligera a les trainer dans toutes vos futures modifications (qui peuvent devenir de plus en plus compliquées).

    Voici donc ma contribution a votre probleme, a adapter et a tester.

    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
     
     
    SELECT
       a.docdate, cardcode,slpcode,
       SUM(CASE a.letype WHEN 1 THEN a.GrosProfit ELSE 0 END) as commande,
       SUM(CASE a.letype WHEN 2 THEN a.GrosProfit ELSE 0 END) as facture 
    FROM
    	( /* Les commandes */
        select 1 as letype,
                 docdate, 
                 GrosProfit,
                 cardcode,
                 slpcode  
         FROM 
             ORDR
          UNION /* Les factures */
         select 2 as letype ,
                  docdate, 
                  GrosProfit,
                  cardcode,
                  slpcode  
          from 
              OINV ) a
    group by docdate,cardcode,slpcode
    /* La gestion des dates */
    having docdate between cast('04/01/2009' AS datetime) and cast('05/01/2009' AS datetime)
    Bon courage

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

Discussions similaires

  1. resultat de l'ensemble de deux requetes
    Par maysa dans le forum Requêtes
    Réponses: 0
    Dernier message: 17/10/2007, 09h56
  2. résultats de deux requetes affichés ensembles
    Par petitours dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/08/2007, 09h31
  3. division des resultats de deux requetes
    Par decour dans le forum Access
    Réponses: 1
    Dernier message: 14/10/2005, 10h42
  4. fusionner le résultat de deux requetes
    Par sami_c dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/05/2004, 09h56
  5. jointure entre deux requete
    Par Youssef dans le forum Langage SQL
    Réponses: 21
    Dernier message: 15/01/2004, 15h13

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