OVH Cloud OVH Cloud

Somme dans une requete SQL

4 réponses
Avatar
Alexandre
Bonjour,
Je souhaiterais additionner les 2 r=E9sultats de ma requ=EAte=20
mais je m'y perd un peu. Je suis s=FBr que vous saurez me=20
r=E9pondre...
Voici ma requ=EAte :

SELECT TOP 2 COUNT(DISTINCT n.NumBornes) AS [Total r=E9cup]
FROM dbo.PAYS p INNER JOIN
dbo.AFFAIRES a ON p.ID_PAYS =3D a.ID_PAYS INNER JOIN
dbo.BORNES b ON a.ID_AFFAIRE =3D b.ID_AFFAIRE INNER JOIN
dbo.NEWDOWNLOAD n ON b.BORNE =3D n.NumBornes
GROUP BY a.ID_PAYS, n.NumInfopak
HAVING (a.ID_PAYS =3D 1) AND (n.NumInfopak <> N'1073741823')=20
OR (a.ID_PAYS =3D 11)ORDER BY n.NumInfopak DESC

Le r=E9sultat, =E0 ce jour, me donne :
Total r=E9cup=20
-----------=20
458
3

Je voudrais qu'il m'affiche 461.

Merci de votre aide

4 réponses

Avatar
Laurent Moreau
Tu peux faire ainsi:

SELECT sum([Total récup]) AS TotalFinal
FROM
(

ta requete


) tmp



Laurent.





"Alexandre" wrote in message
news:1c0d01c485c4$1ddaf6b0$
Bonjour,
Je souhaiterais additionner les 2 résultats de ma requête
mais je m'y perd un peu. Je suis sûr que vous saurez me
répondre...
Voici ma requête :

SELECT TOP 2 COUNT(DISTINCT n.NumBornes) AS [Total récup]
FROM dbo.PAYS p INNER JOIN
dbo.AFFAIRES a ON p.ID_PAYS = a.ID_PAYS INNER JOIN
dbo.BORNES b ON a.ID_AFFAIRE = b.ID_AFFAIRE INNER JOIN
dbo.NEWDOWNLOAD n ON b.BORNE = n.NumBornes
GROUP BY a.ID_PAYS, n.NumInfopak
HAVING (a.ID_PAYS = 1) AND (n.NumInfopak <> N'1073741823')
OR (a.ID_PAYS = 11)ORDER BY n.NumInfopak DESC

Le résultat, à ce jour, me donne :
Total récup
-----------
458
3

Je voudrais qu'il m'affiche 461.

Merci de votre aide
Avatar
Fred BROUARD
Plusieurs erreurs dans ta requête...

1) le HAVING est un filtre sur les résultats. Il n'a d'intérêt que dans le cas
d'un filtrage sur calculs d'agrégats (SUM, MAX, MIN, COUNT, AVG...) donc utilise
un filtre WHERE

2) on ne comprend pas bien l'ordre logique du prédicat du filtre...
s'agit t-il de :
les ID_PAYS = 1 et (les NumInfopak <> N'1073741823 ou les ID_PAYS = 11)
ou bien
(les ID_PAYS = 1 et les NumInfopak <> N'1073741823) ou les ID_PAYS = 11
Pour être sûr de ce que tu veut met des parenthèses là ou il les faut et non pas
à chaque membre de la condition ce qui ne veut rien dire.

A partir de là tu verra êut être mieux comment sommer tes 2 premiers résultats.
Mais je ne comprend pas la logique de ta requête... Que veut tu faire exactement
(en français ...)


SELECT TOP 2 COUNT(DISTINCT n.NumBornes) AS [Total récup]

FROM PAYS p
INNER JOIN AFFAIRES a
ON p.ID_PAYS = a.ID_PAYS
INNER JOIN BORNES b
ON a.ID_AFFAIRE = b.ID_AFFAIRE
INNER JOIN NEWDOWNLOAD n
ON b.BORNE = n.NumBornes

WHERE p.ID_PAYS = 1
AND n.NumInfopak <> N'1073741823' OR p.ID_PAYS = 11

GROUP BY p.ID_PAYS, n.NumInfopak

ORDER BY n.NumInfopak DESC


A +

Alexandre a écrit:
Bonjour,
Je souhaiterais additionner les 2 résultats de ma requête
mais je m'y perd un peu. Je suis sûr que vous saurez me
répondre...
Voici ma requête :

SELECT TOP 2 COUNT(DISTINCT n.NumBornes) AS [Total récup]
FROM dbo.PAYS p INNER JOIN
dbo.AFFAIRES a ON p.ID_PAYS = a.ID_PAYS INNER JOIN
dbo.BORNES b ON a.ID_AFFAIRE = b.ID_AFFAIRE INNER JOIN
dbo.NEWDOWNLOAD n ON b.BORNE = n.NumBornes
GROUP BY a.ID_PAYS, n.NumInfopak
HAVING (a.ID_PAYS = 1) AND (n.NumInfopak <> N'1073741823')
OR (a.ID_PAYS = 11)ORDER BY n.NumInfopak DESC

Le résultat, à ce jour, me donne :
Total récup
-----------
458
3

Je voudrais qu'il m'affiche 461.

Merci de votre aide



--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
Alexandre
J'ai bien essayé de comprendre et de corriger ma requete
en fonction de ta réponse mais sans trop de succes.
1) J'utilise un COUNT DISTINCT au début de ma requête ce
qui implique un HAVING non ?

2) En fait, voici le résumé de l'action en quoi consiste
mon travail :

J'envoie par télédistribution des paquets (d'où NUMINFOPAK
correspondant au N° du paquet) sur des bornes (d'où
NUMBORNES correspondant à leur N°) dans toute l'Europe
(d'où ID_PAYS correspondant à l'identifiant du Pays).
Le probleme est que pour la france, je possède 2 Segment
(ID_PAYS 1 et 11).

Mon but est de récupérer dans un premier temps le dernier
paquet récupéré (ORDER BY n.NumInfopak DESC) et de compter
le nombre de bornes qui l'ont récus. Pour chaque pays ca
ne pose pas trop de probleme, mais pour la France, il faut
que je récupère les 2 derniers paquets et que je cumule le
résultat dans 1 colonne.

La réponse que m'a fait Laurent:
---
SELECT sum([Total récup]) AS TotalFinal
FROM(ta requete) tmp
---
fonctionne, mais si tu vois une autre solution, je suis
tout ouïe.
Espérant avoir été le plus clair possible.
A+

Alex

-----Message d'origine-----
Plusieurs erreurs dans ta requête...

1) le HAVING est un filtre sur les résultats. Il n'a


d'intérêt que dans le cas
d'un filtrage sur calculs d'agrégats (SUM, MAX, MIN,


COUNT, AVG...) donc utilise
un filtre WHERE

2) on ne comprend pas bien l'ordre logique du prédicat du


filtre...
s'agit t-il de :
les ID_PAYS = 1 et (les NumInfopak <> N'1073741823 ou les


ID_PAYS = 11)
ou bien
(les ID_PAYS = 1 et les NumInfopak <> N'1073741823) ou


les ID_PAYS = 11
Pour être sûr de ce que tu veut met des parenthèses là ou


il les faut et non pas
à chaque membre de la condition ce qui ne veut rien dire.

A partir de là tu verra êut être mieux comment sommer tes


2 premiers résultats.
Mais je ne comprend pas la logique de ta requête... Que


veut tu faire exactement
(en français ...)


SELECT TOP 2 COUNT(DISTINCT n.NumBornes) AS [Total récup]

FROM PAYS p
INNER JOIN AFFAIRES a
ON p.ID_PAYS = a.ID_PAYS
INNER JOIN BORNES b
ON a.ID_AFFAIRE = b.ID_AFFAIRE
INNER JOIN NEWDOWNLOAD n
ON b.BORNE = n.NumBornes

WHERE p.ID_PAYS = 1
AND n.NumInfopak <> N'1073741823' OR p.ID_PAYS = 11

GROUP BY p.ID_PAYS, n.NumInfopak

ORDER BY n.NumInfopak DESC


A +

Alexandre a écrit:
Bonjour,
Je souhaiterais additionner les 2 résultats de ma




requête
mais je m'y perd un peu. Je suis sûr que vous saurez me
répondre...
Voici ma requête :

SELECT TOP 2 COUNT(DISTINCT n.NumBornes) AS [Total




récup]
FROM dbo.PAYS p INNER JOIN
dbo.AFFAIRES a ON p.ID_PAYS = a.ID_PAYS INNER JOIN
dbo.BORNES b ON a.ID_AFFAIRE = b.ID_AFFAIRE INNER




JOIN
dbo.NEWDOWNLOAD n ON b.BORNE = n.NumBornes
GROUP BY a.ID_PAYS, n.NumInfopak
HAVING (a.ID_PAYS = 1) AND (n.NumInfopak <>




N'1073741823')
OR (a.ID_PAYS = 11)ORDER BY n.NumInfopak DESC

Le résultat, à ce jour, me donne :
Total récup
-----------
458
3

Je voudrais qu'il m'affiche 461.

Merci de votre aide



--
Frédéric BROUARD, MVP SQL Server. Expert SQL /


spécialiste Delphi, web
Livre SQL - col. Référence :


http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros :


http://sqlpro.developpez.com
************************ www.datasapiens.com


*************************

.



Avatar
Fred BROUARD
essaye :

SELECT COUNT(DISTINCT n.NumBornes) AS [Total récup],
CASE
WHEN p.ID_PAYS = 11 THEN 1
ELSE p.ID_PAYS
END as ID_PAYS

FROM PAYS p

INNER JOIN AFFAIRES a
ON p.ID_PAYS = a.ID_PAYS
INNER JOIN BORNES b
ON a.ID_AFFAIRE = b.ID_AFFAIRE
INNER JOIN NEWDOWNLOAD n
ON b.BORNE = n.NumBornes

GROUP BY p.ID_PAYS

Alexandre a écrit:
J'ai bien essayé de comprendre et de corriger ma requete
en fonction de ta réponse mais sans trop de succes.
1) J'utilise un COUNT DISTINCT au début de ma requête ce
qui implique un HAVING non ?




LE FILTRE HAVING ne porte que sur des RESULTATS pas sur les données.
Pour que tu traite un résultat il te faut au moins une fonction d'agrégation
satstistique. Tu n'en as pas !!! Donc le HAVING ne sert à rien, qu'a perturber
la requête !


2) En fait, voici le résumé de l'action en quoi consiste
mon travail :

J'envoie par télédistribution des paquets (d'où NUMINFOPAK
correspondant au N° du paquet) sur des bornes (d'où
NUMBORNES correspondant à leur N°) dans toute l'Europe
(d'où ID_PAYS correspondant à l'identifiant du Pays).
Le probleme est que pour la france, je possède 2 Segment
(ID_PAYS 1 et 11).

Mon but est de récupérer dans un premier temps le dernier
paquet récupéré (ORDER BY n.NumInfopak DESC) et de compter
le nombre de bornes qui l'ont récus. Pour chaque pays ca
ne pose pas trop de probleme, mais pour la France, il faut
que je récupère les 2 derniers paquets et que je cumule le
résultat dans 1 colonne.

La réponse que m'a fait Laurent:
---
SELECT sum([Total récup]) AS TotalFinal
FROM(ta requete) tmp
---
fonctionne, mais si tu vois une autre solution, je suis
tout ouïe.
Espérant avoir été le plus clair possible.
A+

Alex


-----Message d'origine-----
Plusieurs erreurs dans ta requête...

1) le HAVING est un filtre sur les résultats. Il n'a



d'intérêt que dans le cas

d'un filtrage sur calculs d'agrégats (SUM, MAX, MIN,



COUNT, AVG...) donc utilise

un filtre WHERE

2) on ne comprend pas bien l'ordre logique du prédicat du



filtre...

s'agit t-il de :
les ID_PAYS = 1 et (les NumInfopak <> N'1073741823 ou les



ID_PAYS = 11)

ou bien
(les ID_PAYS = 1 et les NumInfopak <> N'1073741823) ou



les ID_PAYS = 11

Pour être sûr de ce que tu veut met des parenthèses là ou



il les faut et non pas

à chaque membre de la condition ce qui ne veut rien dire.

A partir de là tu verra êut être mieux comment sommer tes



2 premiers résultats.

Mais je ne comprend pas la logique de ta requête... Que



veut tu faire exactement

(en français ...)


SELECT TOP 2 COUNT(DISTINCT n.NumBornes) AS [Total récup]




FROM PAYS p



INNER JOIN AFFAIRES a
ON p.ID_PAYS = a.ID_PAYS
INNER JOIN BORNES b
ON a.ID_AFFAIRE = b.ID_AFFAIRE
INNER JOIN NEWDOWNLOAD n
ON b.BORNE = n.NumBornes

WHERE p.ID_PAYS = 1
AND n.NumInfopak <> N'1073741823' OR p.ID_PAYS = 11

GROUP BY p.ID_PAYS, n.NumInfopak

ORDER BY n.NumInfopak DESC


A +

Alexandre a écrit:

Bonjour,
Je souhaiterais additionner les 2 résultats de ma





requête

mais je m'y perd un peu. Je suis sûr que vous saurez me
répondre...
Voici ma requête :

SELECT TOP 2 COUNT(DISTINCT n.NumBornes) AS [Total





récup]

FROM dbo.PAYS p INNER JOIN
dbo.AFFAIRES a ON p.ID_PAYS = a.ID_PAYS INNER JOIN
dbo.BORNES b ON a.ID_AFFAIRE = b.ID_AFFAIRE INNER





JOIN

dbo.NEWDOWNLOAD n ON b.BORNE = n.NumBornes
GROUP BY a.ID_PAYS, n.NumInfopak
HAVING (a.ID_PAYS = 1) AND (n.NumInfopak <>





N'1073741823')

OR (a.ID_PAYS = 11)ORDER BY n.NumInfopak DESC

Le résultat, à ce jour, me donne :
Total récup
-----------
458
3

Je voudrais qu'il m'affiche 461.

Merci de votre aide



--
Frédéric BROUARD, MVP SQL Server. Expert SQL /



spécialiste Delphi, web

Livre SQL - col. Référence :



http://sqlpro.developpez.com/bookSQL.html

Le site du SQL, pour débutants et pros :



http://sqlpro.developpez.com

************************ www.datasapiens.com



*************************

.









--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************