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 :

Soustraire résultats deux requêtes avec colonne en commun


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Novembre 2017
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Soustraire résultats deux requêtes avec colonne en commun
    Bonjour à tous,

    Je suis sûr que cela va vous paraître simpliste et peut-être instultant (auquel cas je m'en excuse) mais je bloque sur un problème qui bien qu'il semble tout bête, reste un problème pour mes compétences actuelles en SQL.

    Voici deux requêtes :

    Requête 1


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CT_Num, ROUND(SUM(DL_MontantHT),0) 
    FROM F_DOCLIGNE WITH(NOLOCK)
    WHERE CAST(DO_Date As DATE) BETWEEN  '01/06/2018' AND '30/06/2018' AND DO_Type IN ('3','4','6','7')
    GROUP BY CT_Num
    Requête 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT CT_Num, ROUND(SUM(DL_MontantHT),0) FROM F_DOCLIGNE WITH(NOLOCK) WHERE CAST(DO_Date As DATE) BETWEEN  '01/06/2018' AND '30/06/2018' AND DO_Type IN ('4','5')
    GROUP BY CT_Num
    Je voudrais le plus simplement du monde soustraire le résultat de la deuxième requête à la première soit Requête 1 - Requête 2, pour chaque CT_Num donc obtenir :

    CT_Num | Requête1-Requête2
    CT_Num | Requête1-Requête2
    ETC.

    J'ai tenté différentes approches et recherches sans résultats, je me tourne donc vers vous.

    Dernière tentative :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT CT_Num, e.MontantVente - COALESCE(s.MontantVente, 0) FROM
    (SELECT CT_Num, ROUND(SUM(DL_MontantHT),0) AS MontantVente FROM F_DOCLIGNE WITH(NOLOCK) WHERE CAST(DO_Date As DATE) BETWEEN  '01/06/2018' AND '30/06/2018' AND DO_Type IN ('3','4','6','7') GROUP BY CT_Num) AS e
    LEFT JOIN
    (SELECT CT_Num, ROUND(SUM(DL_MontantHT),0) As MontantVente FROM F_DOCLIGNE WITH(NOLOCK) WHERE CAST(DO_Date As DATE) BETWEEN  '01/06/2018' AND '30/06/2018' AND DO_Type IN ('4','5') GROUP BY CT_Num) AS s
    USING(CT_Num)
    J'obtiens : "Syntaxe incorrecte vers 'USING'."

    Merci d'avance pour vos éventuelles réponses.

    Cordialement.

  2. #2
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Vous pouvez faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
    	   CT_Num, 
    	   ROUND(SUM(CASE WHEN  DO_Type IN ('3','4','6','7') THEN DL_MontantHT END ),0) 
    	   - 
    	   ROUND(SUM(CASE WHEN  DO_Type IN ('4','5') THEN DL_MontantHT END ),0) 
     
    FROM F_DOCLIGNE WITH(NOLOCK)
    WHERE CAST(DO_Date As DATE) BETWEEN  '20180601' AND '20180630' AND DO_Type IN ('3','4','5','6','7')
    GROUP BY CT_Num

  3. #3
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Novembre 2017
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci pour votre réactivité.

    Cette méthode semble fonctionnelle, à ceci prêt que j'obtiens des résultats "NULL", sûrement lorsque le résultat de ma requête2 l'est.

    Merci d'avance.


    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    Vous pouvez faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
    	   CT_Num, 
    	   ROUND(SUM(CASE WHEN  DO_Type IN ('3','4','6','7') THEN DL_MontantHT END ),0) 
    	   - 
    	   ROUND(SUM(CASE WHEN  DO_Type IN ('4','5') THEN DL_MontantHT END ),0) 
     
    FROM F_DOCLIGNE WITH(NOLOCK)
    WHERE CAST(DO_Date As DATE) BETWEEN  '20180601' AND '20180630' AND DO_Type IN ('3','4','5','6','7')
    GROUP BY CT_Num

  4. #4
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    d'ailleurs, pourquoi prendre le DO_Type '4' dans tous les cas ?

    aux différences d'arrondi prés (quel sont les types des colonnes en jeu ?) cette requête doit être équivalente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT 
    	   CT_Num, 
    	   ROUND(SUM(CASE WHEN  DO_Type = 5  THEN -DL_MontantHT ELSE DL_MontantHT END ),0) 
    FROM F_DOCLIGNE WITH(NOLOCK)
    WHERE CAST(DO_Date As DATE) BETWEEN  '20180601' AND '20180630' AND DO_Type IN ('3','5','6','7')
    GROUP BY CT_Num

  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
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par starkdev Voir le message
    M j'obtiens des résultats "NULL", sûrement lorsque le résultat de ma requête2 l'est.
    Dans ce cas, vous pouvez ajouter un COALESCE au deuxième ROUND.
    Mais la deuxième requête que j'ai proposée devrait toutefois résoudre ce problème

  6. #6
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Novembre 2017
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    C'est parfait merci, je venais justement de l'ajouter.

    Il faut vraiment que je prenne le temps de me former sérieusement sur ce langage qui est des plus intéressants.

    Merci encore.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/06/2012, 20h40
  2. résultat de requête avec deux champs issus du même champ initial
    Par Macrounet dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 31/08/2010, 17h38
  3. [2.0] Deux requêtes avec les mêmes paramètres
    Par alband85 dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 07/07/2008, 19h28
  4. [MySQL] Résultat de requête avec LEFT
    Par Msieurduss dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/05/2008, 09h44
  5. [Oracle] Requête avec colonne optionnelle
    Par Original Prankster dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/08/2005, 09h24

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