Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/06/2011, 00h32   #1
Nouveau Membre du Club
 
jalal zaime
Inscription : novembre 2010
Messages : 141
Détails du profil
Informations personnelles :
Nom : jalal zaime

Informations forums :
Inscription : novembre 2010
Messages : 141
Points : 37
Points : 37
Par défaut SUM + sous requête

bonjour,

j'essaye d'avoir la somme de cette requete mais quand j'insère SUM cela renvoie une erreur

impossible d’exécuter une fonction d'agrégation sur une expression comportant un agrégat ou une sous requête

voila la requête de base
Code sql :
1
2
3
4
5
6
 
SELECT dbo.etat_engagement.montant_engager + SUM(ISNULL(dbo.modification_engager.montant, 0)) AS engager
FROM  dbo.etat_engagement LEFT OUTER JOIN
dbo.modification_engager ON dbo.etat_engagement.id2 = dbo.modification_engager.id2
WHERE (NOT (dbo.etat_engagement.n_certification LIKE ''))
GROUP BY dbo.etat_engagement.montant_engager

erreur obtenu quand je mis SUM
Code sql :
1
2
 
SELECT SUM(dbo.etat_engagement.montant_engager + SUM(ISNULL(dbo.modification_engager.montant, 0))) AS somme_engager
jalalnet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 08h04   #2
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 139
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 139
Points : 2 467
Points : 2 467
Envoyer un message via Yahoo à zinzineti
Essaye avec ceci :

Code :
SELECT SUM(dbo.etat_engagement.montant_engager + ISNULL(dbo.modification_engager.montant, 0)) AS somme_engager
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 10h23   #3
Nouveau Membre du Club
 
jalal zaime
Inscription : novembre 2010
Messages : 141
Détails du profil
Informations personnelles :
Nom : jalal zaime

Informations forums :
Inscription : novembre 2010
Messages : 141
Points : 37
Points : 37
dsl mais c'est pas ce que je cherche
il ya plusieurs montant modifié pour un montant engager c'est pour cela je calcule le montant engagée + la somme des montant modifié

ma requête est déjà bien sauf j'aimerai avoir une seul montant la sum de tous
jalalnet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 10h37   #4
Candidat au titre de Membre du Club
 
Homme Gratien
Inscription : octobre 2009
Messages : 65
Détails du profil
Informations personnelles :
Nom : Homme Gratien

Informations forums :
Inscription : octobre 2009
Messages : 65
Points : 11
Points : 11
Tu dois faire une sous requete, si tu es est 2005 ou plus tu peux faire :

Code :
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 
	modification_CTE AS ( 
	SELECT
		etat_engagement.id2
		, SUM( dbo.modification_engager.montant ) AS engager
	FROM  
		dbo.modification_engager
	INNER JOIN
		dbo.etat_engagement 
	ON 
		dbo.etat_engagement.id2 = dbo.modification_engager.id2
		AND dbo.etat_engagement.n_certification != ''
	GROUP BY 
		etat_engagement.id2
	)
SELECT
	dbo.etat_engagement.montant_engager + cte.engager
FROM
	dbo.etat_engagement 
LEFT OUTER JOIN
	dbo.modification_CTE
ON 
	dbo.etat_engagement.id2 = modification_CTE.id2
WHERE
	dbo.etat_engagement.n_certification != ''
Au passage je ne comprend pas la ligne
Code :
1
2
 
NOT (dbo.etat_engagement.n_certification LIKE ''))
il faut éviter les like dans la mesure du possible, un simple opérateur différent suffit dans ton cas, si j'ai bien compris

A+
Batou69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 10h50   #5
Nouveau Membre du Club
 
jalal zaime
Inscription : novembre 2010
Messages : 141
Détails du profil
Informations personnelles :
Nom : jalal zaime

Informations forums :
Inscription : novembre 2010
Messages : 141
Points : 37
Points : 37
Citation:
Envoyé par Batou69 Voir le message
Au passage je ne comprend pas la ligne
Code :
1
2
 
NOT (dbo.etat_engagement.n_certification LIKE ''))
il faut éviter les like dans la mesure du possible, un simple opérateur différent suffit dans ton cas, si j'ai bien compris

A+
je vais testé ça
pour
Code sql :
NOT (dbo.etat_engagement.n_certification LIKE ''))
=>dont n_certification est pas vide
jalalnet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 10h52   #6
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
zinzineti vous a donné la solution.

Elle implique que vous supprimiez la clause "GROUP BY" si cela vous avait échappé.
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 11h01   #7
Candidat au titre de Membre du Club
 
Homme Gratien
Inscription : octobre 2009
Messages : 65
Détails du profil
Informations personnelles :
Nom : Homme Gratien

Informations forums :
Inscription : octobre 2009
Messages : 65
Points : 11
Points : 11
Citation:
Envoyé par Sergejack Voir le message
zinzineti vous a donné la solution.

Elle implique que vous supprimiez la clause "GROUP BY" si cela vous avait échappé.
Je ne suis pas d'accord avec toi, car si la table modification_engager contient plusieurs ligne pour chaque id2, alors, la somme va multiplier le etat_engagement.montant_engager inutilement. Et je crois que ce n'est pas le but recherché.

A+
Batou69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 11h12   #8
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Vous pouvez aussi faire comme ceci :

Code SQL :
1
2
3
4
5
6
7
8
9
10
 
SELECT 
    dbo.etat_engagement.montant_engager 
    +(
        SELECT SUM(ISNULL(dbo.modification_engager.montant, 0)) 
        FROM modification_engager 
        WHERE etat_engagement.id2 = modification_engager.id2
    )    AS engager
FROM  dbo.etat_engagement 
WHERE etat_engagement.n_certification <> ''

ou encore
Code SQL :
1
2
3
4
5
6
7
8
9
10
 
SELECT 
    dbo.etat_engagement.montant_engager + somme.montant  AS engager
FROM  dbo.etat_engagement 
CROSS APPLY (
        SELECT SUM(ISNULL(dbo.modification_engager.montant, 0))  AS Montant
        FROM modification_engager 
        WHERE etat_engagement.id2 = modification_engager.id2
    )    Somme
WHERE etat_engagement.n_certification <> ''
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 11h44   #9
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Citation:
Envoyé par Batou69 Voir le message
Je ne suis pas d'accord avec toi, car si la table modification_engager contient plusieurs ligne pour chaque id2, alors, la somme va multiplier le etat_engagement.montant_engager inutilement. Et je crois que ce n'est pas le but recherché.

A+
Au temps pour moi.

Pour m'excuser voici une façon poilante (...) de résoudre votre problème sans sous query :

Code :
1
2
3
4
5
 
SELECT top(1)
SUM (dbo.etat_engagement.montant_engager)   over (partition BY dbo.etat_engagement.id2) + SUM(ISNULL(dbo.modification_engager.montant, 0)) AS engager over()
FROM  dbo.etat_engagement LEFT OUTER JOIN
dbo.modification_engager ON dbo.etat_engagement.id2 = dbo.modification_engager.id2
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 12h00   #10
Candidat au titre de Membre du Club
 
Homme Gratien
Inscription : octobre 2009
Messages : 65
Détails du profil
Informations personnelles :
Nom : Homme Gratien

Informations forums :
Inscription : octobre 2009
Messages : 65
Points : 11
Points : 11
Arf, alors celle là, je comprends même pas la requete.

Mais je vais me documenter sur le over dans un sum.....
Batou69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 14h26   #11
Nouveau Membre du Club
 
jalal zaime
Inscription : novembre 2010
Messages : 141
Détails du profil
Informations personnelles :
Nom : jalal zaime

Informations forums :
Inscription : novembre 2010
Messages : 141
Points : 37
Points : 37
merci pour votre réponse
pour la solution de aieeeuuuuu & Sergejack je peut pas l'utilisée parceque sqlserver 2005 express pris pas en charge l'instruction CROSS APPLY | OVER

pour la réponse de Batou69
erreur
dbo.modification_CTE non valide
jalalnet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 14h30   #12
Candidat au titre de Membre du Club
 
Homme Gratien
Inscription : octobre 2009
Messages : 65
Détails du profil
Informations personnelles :
Nom : Homme Gratien

Informations forums :
Inscription : octobre 2009
Messages : 65
Points : 11
Points : 11
Citation:
Envoyé par jalalnet Voir le message
merci pour votre réponse
pour la réponse de Batou69
erreur
dbo.modification_CTE non valide
Oui, n'ayant pas les tables que tu as, je n'ai pas pu tester la requete. Il faut enlever le nom du schema (dbo) et cela devrait fonctionner.
Batou69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 15h03   #13
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par jalalnet Voir le message
pour la solution de aieeeuuuuu & Sergejack je peut pas l'utilisée parceque sqlserver 2005 express pris pas en charge l'instruction CROSS APPLY | OVER


sauf erreur de ma part (ou exception de la version Exrpress ?), la version 2005 prend bien en charge le CROSS APPLY, tout comme les fonctions de fentrage... Etes vous sur de la version ? quel est le message d'erreur que vous avez ?

sinon, avez vous essayé ma première requête, qui n'utilise pas le CROSS APPLY ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 15h11   #14
Nouveau Membre du Club
 
jalal zaime
Inscription : novembre 2010
Messages : 141
Détails du profil
Informations personnelles :
Nom : jalal zaime

Informations forums :
Inscription : novembre 2010
Messages : 141
Points : 37
Points : 37
Citation:
Envoyé par aieeeuuuuu Voir le message


sauf erreur de ma part (ou exception de la version Exrpress ?), la version 2005 prend bien en charge le CROSS APPLY, tout comme les fonctions de fentrage... Etes vous sur de la version ? quel est le message d'erreur que vous avez ?

sinon, avez vous essayé ma première requête, qui n'utilise pas le CROSS APPLY ?
pour ta première requête c'est comme la mienne il renvoie la somme du montant engagé + somme(modification) pour chaque ligne
mais moi je cherche la somme de tous

est pour la deuxième quand j’exécute pour la première fois
j'ai l erreur :
La construction ou l'instruction SQL CROSS APPLY n'est pas prise en charge.
est après
l'identificateur en plusieurs parties somme.montant ne peut pas être lié
jalalnet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 15h14   #15
Nouveau Membre du Club
 
jalal zaime
Inscription : novembre 2010
Messages : 141
Détails du profil
Informations personnelles :
Nom : jalal zaime

Informations forums :
Inscription : novembre 2010
Messages : 141
Points : 37
Points : 37
Citation:
Envoyé par Batou69 Voir le message
Oui, n'ayant pas les tables que tu as, je n'ai pas pu tester la requete. Il faut enlever le nom du schema (dbo) et cela devrait fonctionner.
je l'ai enlevé puis nouveau erreur
l'identificateur en plusieurs parties cte.engager ne peut pas être liè
jalalnet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 15h22   #16
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par jalalnet Voir le message
pour ta première requête c'est comme la mienne il renvoie la somme du montant engagé + somme(modification) pour chaque ligne
mais moi je cherche la somme de tous

Un petit jeu de données + resultat attendu serait sans doute plus clair...

est-ce ceci que vous voulez ?
Code SQL :
1
2
3
4
5
6
7
8
9
10
11
 
SELECT 
    SUM(dbo.etat_engagement.montant_engager )
    +(
        SELECT SUM(ISNULL(dbo.modification_engager.montant, 0)) 
        FROM modification_engager 
        WHERE etat_engagement.id2 = modification_engager.id2
    )    AS engager
FROM  dbo.etat_engagement 
WHERE etat_engagement.n_certification <> ''
GROUP BY etat_engagement.id2
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 15h30   #17
Nouveau Membre du Club
 
jalal zaime
Inscription : novembre 2010
Messages : 141
Détails du profil
Informations personnelles :
Nom : jalal zaime

Informations forums :
Inscription : novembre 2010
Messages : 141
Points : 37
Points : 37
ma requête de base
Code sql :
1
2
3
4
5
6
 
SELECT dbo.etat_engagement.montant_engager + SUM(ISNULL(dbo.modification_engager.montant, 0)) AS engager
FROM  dbo.etat_engagement LEFT OUTER JOIN
dbo.modification_engager ON dbo.etat_engagement.id2 = dbo.modification_engager.id2
WHERE (NOT (dbo.etat_engagement.n_certification LIKE ''))
GROUP BY dbo.etat_engagement.montant_engager
résultat de la requête
20000 => contient (montant engagée + sum modification du monatn engagée)
15000
22222
.
.
.
ce que je veut
20000
15000
22222
.
.
.

75222 la somme de tous
jalalnet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 15h53   #18
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
SELECT dbo.etat_engagement.montant_engager + SUM(ISNULL(dbo.modification_engager.montant, 0)) AS engager
FROM dbo.etat_engagement LEFT OUTER JOIN
dbo.modification_engager ON dbo.etat_engagement.id2 = dbo.modification_engager.id2
WHERE (NOT (dbo.etat_engagement.n_certification LIKE ''))
GROUP BY dbo.etat_engagement.montant_engager


Code :
1
2
3
4
5
6
7
8
9
10
11
 
WITH CTE AS(SELECT etat_engagement.montant_engager,dbo.etat_engagement.montant_engager + SUM(ISNULL(dbo.modification_engager.montant, 0)) AS engager
FROM  dbo.etat_engagement LEFT OUTER JOIN
dbo.modification_engager ON dbo.etat_engagement.id2 = dbo.modification_engager.id2
WHERE (NOT (dbo.etat_engagement.n_certification LIKE ''))
GROUP BY dbo.etat_engagement.montant_engager)
SELECT engager
FROM CTE 
UNION ALL
SELECT SUM(engager) AS engager
FROM CTE
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 15h54   #19
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
donc vous voulez une ligne supplémentaire qui fait la somme de tous ?

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
SELECT 
    etat_engagement.id2,
    SUM(etat_engagement.montant_engager  + somme) AS montant
FROM  dbo.etat_engagement 
LEFT OUTER JOIN  (
    SELECT 
        id2,
        SUM(ISNULL(dbo.modification_engager.montant, 0))  AS somme
    FROM modification_engager 
    GROUP BY modification_engager.id2
)    T
    ON T.id2 = etat_engagement.id2
WHERE etat_engagement.n_certification <> ''
GROUP BY etat_engagement.id2 WITH ROLLUP

La ligne ou etat_engagement.id2 est NULL, c'est le total
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 15h59   #20
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Je préfère ma mienne NAH
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h22.


 
 
 
 
Partenaires

Hébergement Web