Menu

{SQL Server} Somme de deux requêtes imbriquée [Résolu/Fermé]

- - Dernière réponse :  yanouk - 24 juin 2009 à 14:52
Bonjour,

voici ma requête :
SELECT
distinct b.[Code],
 ( select cast(sum(a.Amount) as numeric(10,2)) 
 FROM
   [Sales Line] a , [Sales header]
 where a.[Document No_]=[Sales header].No_
 and b.[Code]=a.[PfsSalesperson Code]
and [Sales header].[Currency Factor]=0
),
 ( select cast((sum(a.Amount)*(1/[Sales header].[Currency Factor])) as numeric(10,2))
 FROM
   [Sales Line] a , [Sales header]
 where a.[Document No_]=[Sales header].No_
 and b.[Code]=a.[PfsSalesperson Code]
and [Sales header].[Currency Factor]<>0
group by [Sales header].[Currency Factor]
)
FROM
  [Salesperson_Purchaser] b
where b.[Code] between '100' and '199'
group by
b.[Code]
order by
b.[Code]


petite explication :

ma première requête retourne les montants par représentant où la devise est l'€ (par défault "Currency Factor" = 0)

ma deuxième requête retourne les montants par représentant où la devise est différent de l'€ ("Currency Factor" est donc différent de 0)
je converti donc ce montant avec "Currency Factor" pour obtenir un montant en €


mon problème :

je voudrais faire une addition des deux requêtes imbriquées afin d'obtenir une seule colonne.
est-t-il possible de faire cela ?

merci bien pour votre aide!
Afficher la suite 

6 réponses

Meilleure réponse
3
Merci
impek!! ça marche très bien!

j'avais également trouver une solution mais il me ramener une erreur de division par 0
du coup j'étais obligé de mettre la devise en dur dans ma requête pour quelle fonctionne..pas top!

en tout cas je te remercie vraiment, tu m'a vraiment aidé!

@+
yanouk

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 54850 internautes nous ont dit merci ce mois-ci

Messages postés
1265
Date d'inscription
mercredi 26 septembre 2007
Statut
Membre
Dernière intervention
29 juillet 2010
1191
1
Merci
Bonjour,

J'ai un peu changé le code et je l'ai testé avec SQL Server (pas les mêmes tables) et je n'ai plus d'erreur de syntaxe
SELECT distinct b.[Code],
(select sum(
 CASE [Sales header].[Currency Factor]
 WHEN 0 THEN a.Amount
 ELSE (a.Amount * (1/[Sales header].[Currency Factor]))
 END)
 FROM
   [Sales Line] a , [Sales header]
 where a.[Document No_]=[Sales header].No_
 and b.[Code]=a.[PfsSalesperson Code]) as MontantTotal
FROM
  [Salesperson_Purchaser] b
where b.[Code] between '100' and '199'

J'ai aussi retiré le group by et order by car cela n'est pas nécessaire quand on utilise DISTINCT
A plus
Messages postés
1265
Date d'inscription
mercredi 26 septembre 2007
Statut
Membre
Dernière intervention
29 juillet 2010
1191
-1
Merci
Bonjour,

Le code suivant devrait faire ce que tu veux
SELECT
distinct b.[Code],
 (( select cast(sum(a.Amount) as numeric(10,2)) 
 FROM
   [Sales Line] a , [Sales header]
 where a.[Document No_]=[Sales header].No_
 and b.[Code]=a.[PfsSalesperson Code]
and [Sales header].[Currency Factor]=0
) +
 ( select cast((sum(a.Amount)*(1/[Sales header].[Currency Factor])) as numeric(10,2))
 FROM
   [Sales Line] a , [Sales header]
 where a.[Document No_]=[Sales header].No_
 and b.[Code]=a.[PfsSalesperson Code]
and [Sales header].[Currency Factor]<>0
group by [Sales header].[Currency Factor]
)) as MontantTotal
FROM
  [Salesperson_Purchaser] b
where b.[Code] between '100' and '199'
group by
b.[Code]
order by
b.[Code]

J'ai remplacé la , par le signe + entre les deux résultats.
A plus
-1
Merci
non cela ne fonctionne pas, désolé j'avais oublié de préciser que j'avais tester ça!

en fait j'ai tester pas mal de choses sans parvenir à mes fin...:(

espérant que un de vous aura une solution!

merci quand même pour l'aide

++
Messages postés
1265
Date d'inscription
mercredi 26 septembre 2007
Statut
Membre
Dernière intervention
29 juillet 2010
1191
-1
Merci
Bonjour,

Peux-tu alors essayer le code suivant
SELECT distinct b.[Code],
sum(
(select
 CASE [Sales header].[Currency Factor]
 WHEN 0 THEN a.Amount
 ELSE (a.Amount * (1/[Sales header].[Currency Factor]))
 END
 FROM
   [Sales Line] a , [Sales header]
 where a.[Document No_]=[Sales header].No_
 and b.[Code]=a.[PfsSalesperson Code]
)) as MontantTotal
FROM
  [Salesperson_Purchaser] b
where b.[Code] between '100' and '199'
group by
b.[Code]
order by
b.[Code]


Je ne l'ai pas testé, à toi de voir.
A plus
-1
Merci
je n'avais pas pensé au case c'est vrai, cela semblé une très bonne solution mais...erreur ;(

il me dit :
Impossible d'exécuter une fonction d'agrégation sur une expression comportant un agrégat ou une sous-requête.
Les éléments ORDER BY doivent se retrouver dans la liste de sélection si SELECT DISTINCT est spécifié.

j'ai essayer de bidouyer autour de ça mais rien à faire...

une autre solution peut-être?!!^^
merci quand même
++