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 :

Fusion de 2 select : comment faire ?


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 88
    Points : 48
    Points
    48
    Par défaut Fusion de 2 select : comment faire ?
    Bonjour,

    J'ai besoin de retourner le résultat provenant de 2 select différents en ne faisant en réalité qu'1 seul select. Je m'explique :

    Voici mon code :
    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
     
    Declare @annee as int
     
    set @annee = 2010
     
    SELECT
      C.NOM_CLIENT,
      OCT   = SUM(CASE WHEN MONTH(SCD.DATE)=10 AND YEAR(SCD.DATE)=@ANNEE   AND SCD.DATE >= getdate() THEN SCD.MONTANT_EURO ELSE 0 END),
      NOV   = SUM(CASE WHEN MONTH(SCD.DATE)=11 AND YEAR(SCD.DATE)=@ANNEE   AND SCD.DATE >= getdate() THEN SCD.MONTANT_EURO ELSE 0 END),
      DEC   = SUM(CASE WHEN MONTH(SCD.DATE)=12 AND YEAR(SCD.DATE)=@ANNEE   AND SCD.DATE >= getdate() THEN SCD.MONTANT_EURO ELSE 0 END),
      JANV  = SUM(CASE WHEN MONTH(SCD.DATE)=1  AND YEAR(SCD.DATE)=@ANNEE+1 AND SCD.DATE >= getdate() THEN SCD.MONTANT_EURO ELSE 0 END),
      FEV   = SUM(CASE WHEN MONTH(SCD.DATE)=2  AND YEAR(SCD.DATE)=@ANNEE+1 AND SCD.DATE >= getdate() THEN SCD.MONTANT_EURO ELSE 0 END),
      MARS  = SUM(CASE WHEN MONTH(SCD.DATE)=3  AND YEAR(SCD.DATE)=@ANNEE+1 AND SCD.DATE >= getdate() THEN SCD.MONTANT_EURO ELSE 0 END),
      AVRIL = SUM(CASE WHEN MONTH(SCD.DATE)=4  AND YEAR(SCD.DATE)=@ANNEE+1 AND SCD.DATE >= getdate() THEN SCD.MONTANT_EURO ELSE 0 END),
      MAI   = SUM(CASE WHEN MONTH(SCD.DATE)=5  AND YEAR(SCD.DATE)=@ANNEE+1 AND SCD.DATE >= getdate() THEN SCD.MONTANT_EURO ELSE 0 END),
      JUIN  = SUM(CASE WHEN MONTH(SCD.DATE)=6  AND YEAR(SCD.DATE)=@ANNEE+1 AND SCD.DATE >= getdate() THEN SCD.MONTANT_EURO ELSE 0 END),
      JUIL  = SUM(CASE WHEN MONTH(SCD.DATE)=7  AND YEAR(SCD.DATE)=@ANNEE+1 AND SCD.DATE >= getdate() THEN SCD.MONTANT_EURO ELSE 0 END),
      AOUT  = SUM(CASE WHEN MONTH(SCD.DATE)=8  AND YEAR(SCD.DATE)=@ANNEE+1 AND SCD.DATE >= getdate() THEN SCD.MONTANT_EURO ELSE 0 END),
      SEPT  = SUM(CASE WHEN MONTH(SCD.DATE)=9  AND YEAR(SCD.DATE)=@ANNEE+1 AND SCD.DATE >= getdate() THEN SCD.MONTANT_EURO ELSE 0 END),
      TOTAL = SUM(CASE WHEN (MONTH(SCD.DATE)>=10 AND (YEAR(SCD.DATE)=@ANNEE) OR (MONTH(SCD.DATE) <= 9 AND YEAR(SCD.DATE)=@ANNEE + 1)) AND SCD.DATE >= getdate() THEN SCD.MONTANT_EURO ELSE 0 END)
    FROM SCD, CDE, CLIENT C, AFFAIRE A    
    WHERE SCD.N_CDE_CLI = CDE.N_CDE_CLI
    AND   CDE.N_affaire = A.N_affaire
    AND   A.N_CLIENT    = C.N_CLIENT
    GROUP BY C.NOM_CLIENT
     
    UNION ALL
     
    SELECT
      C.NOM_CLIENT,
      OCT =   SUM(CASE WHEN MONTH(DATE_FACTURE)=10 AND YEAR(DATE_FACTURE)=@ANNEE   AND DATE_FACTURE < getdate() THEN (CASE WHEN F.AVOIR='OUI' THEN -HT_EURO ELSE HT_EURO END) ELSE 0 END),
      NOV =   SUM(CASE WHEN MONTH(DATE_FACTURE)=11 AND YEAR(DATE_FACTURE)=@ANNEE   AND DATE_FACTURE < getdate() THEN (CASE WHEN F.AVOIR='OUI' THEN -HT_EURO ELSE HT_EURO END) ELSE 0 END),
      DEC =   SUM(CASE WHEN MONTH(DATE_FACTURE)=12 AND YEAR(DATE_FACTURE)=@ANNEE   AND DATE_FACTURE < getdate() THEN (CASE WHEN F.AVOIR='OUI' THEN -HT_EURO ELSE HT_EURO END) ELSE 0 END),
      JANV =  SUM(CASE WHEN MONTH(DATE_FACTURE)=1  AND YEAR(DATE_FACTURE)=@ANNEE+1 AND DATE_FACTURE < getdate() THEN (CASE WHEN F.AVOIR='OUI' THEN -HT_EURO ELSE HT_EURO END) ELSE 0 END),
      FEV =   SUM(CASE WHEN MONTH(DATE_FACTURE)=2  AND YEAR(DATE_FACTURE)=@ANNEE+1 AND DATE_FACTURE < getdate() THEN (CASE WHEN F.AVOIR='OUI' THEN -HT_EURO ELSE HT_EURO END) ELSE 0 END),
      MARS =  SUM(CASE WHEN MONTH(DATE_FACTURE)=3  AND YEAR(DATE_FACTURE)=@ANNEE+1 AND DATE_FACTURE < getdate() THEN (CASE WHEN F.AVOIR='OUI' THEN -HT_EURO ELSE HT_EURO END) ELSE 0 END),
      AVRIL = SUM(CASE WHEN MONTH(DATE_FACTURE)=4  AND YEAR(DATE_FACTURE)=@ANNEE+1 AND DATE_FACTURE < getdate() THEN (CASE WHEN F.AVOIR='OUI' THEN -HT_EURO ELSE HT_EURO END) ELSE 0 END),
      MAI =   SUM(CASE WHEN MONTH(DATE_FACTURE)=5  AND YEAR(DATE_FACTURE)=@ANNEE+1 AND DATE_FACTURE < getdate() THEN (CASE WHEN F.AVOIR='OUI' THEN -HT_EURO ELSE HT_EURO END) ELSE 0 END),
      JUIN =  SUM(CASE WHEN MONTH(DATE_FACTURE)=6  AND YEAR(DATE_FACTURE)=@ANNEE+1 AND DATE_FACTURE < getdate() THEN (CASE WHEN F.AVOIR='OUI' THEN -HT_EURO ELSE HT_EURO END) ELSE 0 END),
      JUIL =  SUM(CASE WHEN MONTH(DATE_FACTURE)=7  AND YEAR(DATE_FACTURE)=@ANNEE+1 AND DATE_FACTURE < getdate() THEN (CASE WHEN F.AVOIR='OUI' THEN -HT_EURO ELSE HT_EURO END) ELSE 0 END),
      AOUT =  SUM(CASE WHEN MONTH(DATE_FACTURE)=8  AND YEAR(DATE_FACTURE)=@ANNEE+1 AND DATE_FACTURE < getdate() THEN (CASE WHEN F.AVOIR='OUI' THEN -HT_EURO ELSE HT_EURO END) ELSE 0 END),
      SEPT =  SUM(CASE WHEN MONTH(DATE_FACTURE)=9  AND YEAR(DATE_FACTURE)=@ANNEE+1 AND DATE_FACTURE < getdate() THEN (CASE WHEN F.AVOIR='OUI' THEN -HT_EURO ELSE HT_EURO END) ELSE 0 END),
      TOTAL = SUM(CASE WHEN (MONTH(DATE_FACTURE)>=10 AND (YEAR(DATE_FACTURE)=@ANNEE) OR (MONTH(DATE_FACTURE) <= 9 AND YEAR(DATE_FACTURE)=@ANNEE + 1)) AND DATE_FACTURE < getdate() THEN (CASE WHEN F.AVOIR='OUI' THEN -HT_EURO ELSE HT_EURO END) ELSE 0 END)
    FROM FACTURE F, CLIENT C
    WHERE F.N_CLIENT = C.N_CLIENT
    GROUP BY C.NOM_CLIENT
    ORDER BY C.NOM_CLIENT
    Comme clients j'ai : TOTO, TITI et TATA

    Le code précédent me retourne le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TATA 	0.00	0.00	0.00	30.50	0.00	0.00	0.00	0.00	0.00	0.00	0.00	0.00	30.50
    TATA 	0.00	0.00	0.00	0.00	488.00	0.00	0.00	0.00	0.00	0.00	0.00	0.00	488.00
    TITI	0.00	0.00	0.00	286.26	0.00	0.00	0.00	0.00	0.00	0.00	0.00	0.00	286.26
    TITI	0.00	0.00	0.00	0.00	0.00	0.00	0.00	0.00	3749.00	0.00	0.00	0.00	3749.00
    TOTO	85.40	393.55	0.00	2928.90	0.00	0.00	0.00	0.00	0.00	0.00	0.00	0.00	3407.85
    TOTO	0.00	0.00	0.00	0.00	0.00	24.40	18.30	76.25	0.00	45.75	36.60	24.40	225.70
    Je souhaite faire une seule requête SELECT pour obtenir le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TATA 	0.00	0.00	0.00	30.50	488.00	0.00	0.00	0.00	0.00	0.00	0.00	0.00	518.50
    TITI	0.00	0.00	0.00	286.26	0.00	0.00	0.00	0.00	3749.00	0.00	0.00	0.00	4035.26
    TOTO	85.40	393.55	0.00	2928.90	0.00	24.40	18.30	76.25	0.00	45.75	36.60	24.40	3633.55
    En fait au lieu d'avoir 2 lignes par clients, j'ai ai 1 seule avec le cumul des valeurs de chaque ligne.

    Que pouvez-vous me proposer pour répondre à mon besoin ?

    Merci d'avance à tous.

    Alf

  2. #2
    Invité
    Invité(e)
    Par défaut
    quelque chose dans ce goût là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select CLI.Nom_client, sum ( coalesce (DEV.Mtt_devis , 0) ) + sum ( coalesce (FAC.Mtt_facture , 0) ) MTT_total
    from Clients CLI
    left outer join devis DEV
    	on DEV.id_client = CLI.id_client
    left outer join facture FAC
    	on FAC.id_client = CLI.id_client
    à vérifier : les cas où il n'y a pas de devis ou de facture pour un client donné.

    [edit]Entre temps, la requête du demandeur s'est transformée radicalement.

  3. #3
    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 utiliser UNION ALL pour cela :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT C.ID_Client, Nom_Client, COALESCE(SUM(Montant), 0)
    FROM CLIENT C
    LEFT OUTER JOIN (
        SELECT ID_Client, MTT_Devis AS Montant
        FROM DEVIS
        UNION ALL
        SELECT ID_Client, MTT_Facture AS Montant
        FROM FACTURE
    ) T ON C.ID_Client = T.ID_Client
    GROUP BY C.IDClient, Nom_Client

  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
    Citation Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
    quelque chose dans ce goût là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select CLI.Nom_client, sum ( coalesce (DEV.Mtt_devis , 0) ) + sum ( coalesce (FAC.Mtt_facture , 0) ) MTT_total
    from Clients CLI
    left outer join devis DEV
    	on DEV.id_client = CLI.id_client
    left outer join facture FAC
    	on FAC.id_client = CLI.id_client
    à vérifier : les cas où il n'y a pas de devis ou de facture pour un client donné.
    Hmmm, à vérifier aussi le cas ou un client a deux factures ET deux devis, chacun sera comptabilisé en double

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Hmmm, à vérifier aussi le cas ou un client a deux factures ET deux devis, chacun sera comptabilisé en double
    effectivement, c'est totalement cochon mon truc !
    Ta solution est plus propre.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 88
    Points : 48
    Points
    48
    Par défaut
    Bonsoir,

    En effet mon premier post était carrément différent, mais ç'était à cause de la déconnexion du site : je mets trop de temps pour expliquer. La prochaine fois je ferais mon texte dans un éditeur et je ferai un copier/coller sur le site.

    Alors j'ai trouvé une solution (radicalement differente), mais c'est trop long : 1minute 20 secondes de traitement alors que pour la version ci-dessus c'était 2 secondes.

    Aussi, si vous avez d'autres suggestions par rapport à la requête du 1er post, je suis preneur.


    Alf

  7. #7
    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
    Si la solution que vous avez postée met 5 secondes et que cela vous convient , vous pouvez appliquer directement la solution que je vous ai proposée,


    Sinon, vous pouvez aussi utiliser le résultat de votre requête complète comme une pseudo table, et grouper de nouveau (pour faire la somme des sommes). Vous pourriez alors calculer votre TOTAL à ce moment là, pour éviter la dernière ligne de cases imbriqués... !

    ça c'est pour les solutions rapides à mettre en oeuvre à partir de la requête que vous avez déjà écrite, mais qui pourrait être je pense optimisée.

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/02/2010, 02h40
  2. Un filtre = un select.. Comment faire et plus ?
    Par mederik dans le forum Cognos
    Réponses: 2
    Dernier message: 23/01/2010, 02h37
  3. Réponses: 4
    Dernier message: 10/12/2007, 22h10
  4. Select (comment faire)
    Par fourniey dans le forum Langage
    Réponses: 4
    Dernier message: 17/10/2007, 16h34
  5. comment faire un insert, + select + update dans la meme requete
    Par jam92400 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 27/06/2006, 18h33

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