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

MS SQL Server Discussion :

Requête SQL


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2010
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 150
    Par défaut Requête SQL
    bonjour j'ai besoin d'aide pour résoudre mon problème

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT     dbo.nature_engagement.nature_engagement, dbo.etat_engagement.n_nature_engagement, dbo.etat_engagement.montant_engager, 
    SUM(CASE WHEN DATALENGTH(COALESCE(dbo.modification_engager.n_certification2, '')) = 0 THEN 0 ELSE ISNULL(dbo.modification_engager.montant, 0) END) AS modification_engager, 
    SUM(dbo.etat_mandatement.montant_mandater) AS total_mandater
    FROM   dbo.etat_budget INNER JOIN dbo.etat_engagement ON dbo.etat_budget.id1 = dbo.etat_engagement.id1 INNER JOIN dbo.nature_engagement ON dbo.etat_engagement.id_nature_engagement = dbo.nature_engagement.id_nature_engagement INNER JOIN
     dbo.rubrique_budgetaire ON dbo.etat_budget.id_rubrique = dbo.rubrique_budgetaire.id_rubrique LEFT OUTER JOIN
    dbo.etat_mandatement ON dbo.etat_engagement.id2 = dbo.etat_mandatement.id2 LEFT OUTER JOIN
    dbo.modification_engager ON dbo.etat_engagement.id2 = dbo.modification_engager.id2
    GROUP BY dbo.nature_engagement.nature_engagement, dbo.etat_engagement.n_nature_engagement, dbo.etat_engagement.montant_engager
    le problème réside dans le champs modification_engager la somme renvoiyé par se dernier se fais multiplié par le nombre d'enregistrement dans la table etat_mandatement relatif a celui la
    je sais pas comment le grouper

  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
    Par défaut
    Bonjour,

    Vous devez regrouper avant la jointure :

    comme ceci :

    Code SQL : 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
     
    SELECT     
    	NE.nature_engagement, 
    	EE.n_nature_engagement, 
    	EE.montant_engager, 
    	SUM(
    		CASE 
    			WHEN DATALENGTH(COALESCE(ME.n_certification2, '')) = 0 
    				THEN 0 
    			ELSE ISNULL(ME.montant, 0) 
    		END
    	) AS modification_engager, 
    	EM.total_mandater
    FROM   dbo.etat_budget EB
    INNER JOIN dbo.etat_engagement EE
    	ON EB.id1 = EE.id1 
    INNER JOIN dbo.nature_engagement NE
    	ON EE.id_nature_engagement = NE.id_nature_engagement 
    INNER JOIN dbo.rubrique_budgetaire RB
    	ON EB.id_rubrique = RB.id_rubrique 
    LEFT OUTER JOIN (
    	SELECT 
    		id2, 
    		SUM(EM.montant_mandater) AS total_mandater
    	FROM dbo.etat_mandatement 
    	GROUP BY id2
    ) EM
    	ON EE.id2 = EM.id2 
    LEFT OUTER JOIN dbo.modification_engager ME 
    	ON EE.id2 = ME.id2
    GROUP BY 
    	NE.nature_engagement, 
    	EE.n_nature_engagement, 
    	EE.montant_engager

    ou comme cela

    Code SQL : 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
     
    SELECT     
    	NE.nature_engagement, 
    	EE.n_nature_engagement, 
    	EE.montant_engager, 
    	SUM(
    		CASE 
    			WHEN DATALENGTH(COALESCE(ME.n_certification2, '')) = 0 
    				THEN 0 
    			ELSE ISNULL(ME.montant, 0) 
    		END
    	) AS modification_engager, 
    	TM.total_mandater
    FROM   dbo.etat_budget EB
    INNER JOIN dbo.etat_engagement EE
    	ON EB.id1 = EE.id1 
    INNER JOIN dbo.nature_engagement NE
    	ON EE.id_nature_engagement = NE.id_nature_engagement 
    INNER JOIN dbo.rubrique_budgetaire RB
    	ON EB.id_rubrique = RB.id_rubrique 
    OUTER APPLY (
    	SELECT SUM(EM.montant_mandater) AS total_mandater
    	FROM dbo.etat_mandatement EM
    	WHERE EE.id2 = EM.id2
    ) TM 
    LEFT OUTER JOIN dbo.modification_engager ME 
    	ON EE.id2 = ME.id2
    GROUP BY 
    	NE.nature_engagement, 
    	EE.n_nature_engagement, 
    	EE.montant_engager

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2010
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 150
    Par défaut
    bonjour,
    merci pour votre réponse
    j'ai essayé le premier code mais , ca renvoie une erreur


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    l'identificateur en plusieurs parties "EM.mantant_mandater" ne peut pas étre lié

  4. #4
    Membre confirmé
    Inscrit en
    Novembre 2010
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 150
    Par défaut
    et pour le deuxième
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    la construction ou l'instruction SQL OUTER APPLY n'est pas pris en charge

  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
    pour la première requete, il faut enlever l'alias de la table dans la sous requête :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SUM(montant_mandater) AS total_mandater

    au lieu de :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SUM(EM.montant_mandater) AS total_mandater

    Pour la deuxième, vous n'avez pas précisé votre version de SQL Server.

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Pour la deuxième, jalalnet doit travailler sous SQL Server 2000.
    La première requête fait très bien le travail

    Rappelons que APPLY (tout comme PIVOT et UNPIVOT) ne sont pas des opérateurs ANSI

    Un autre 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
    SELECT		NE.nature_engagement
    		, EE.n_nature_engagement
    		, EE.montant_engager
    		SUM
    		(
    			CASE 
    				WHEN DATALENGTH(COALESCE(ME.n_certification2, '')) = 0 THEN 0 
    				ELSE ISNULL(ME.montant, 0)
    			END
    		) AS modification_engager, 
    		(
    			SELECT	SUM(EM.montant_mandater) AS total_mandater
    			FROM	dbo.etat_mandatement AS EM
    			WHERE	EE.id2 = EM.id2 
    			GROUP	BY id2
     
    		) AS total_mandater
    FROM		dbo.etat_budget EB
    INNER JOIN	dbo.etat_engagement EE
    			ON EB.id1 = EE.id1 
    INNER JOIN	dbo.nature_engagement NE
    			ON EE.id_nature_engagement = NE.id_nature_engagement 
    INNER JOIN	dbo.rubrique_budgetaire RB
    			ON EB.id_rubrique = RB.id_rubrique
    LEFT JOIN	dbo.modification_engager ME 
    			ON EE.id2 = ME.id2
    GROUP BY	NE.nature_engagement, EE.n_nature_engagement, EE.montant_engager
    @++

Discussions similaires

  1. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/07/2024, 15h41
  2. [ DB2 ] [ AS400] requête sql
    Par zinaif dans le forum DB2
    Réponses: 6
    Dernier message: 23/08/2008, 19h42
  3. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  4. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26
  5. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 11h37

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