aide pour une requete svp

aide pour une requete svp - SQL/NoSQL - Programmation

Marsh Posté le 25-02-2005 à 14:20:27    

J'ai besoin d'aide pour ne faire qu'une seul requete des deux suivante. Voici mon objectif et les info necessaire, j en ai p-e oublié mais demander les moi!
 
Pour une firme donnée, a une periode donnée (ici firm 2 periode 200501)
donner par numero, l'index, le montant total, et le montant a soustraire.
 
la table 'Total' contient des enregistrements d'achats, la deuxieme, 'Retirer', contient les achats qui ont ete refusé.
 
la premiere requete me permet de retrouvé le montant total des achats
la second permet de retrouver le montant total refusé
 
 
Mais comment n'en faire qu'une seul?
 
(type = type d'enregistrement, pour plusieur type 'detail', correspondent des 'SousTotal', pour le total, faut additionner soit les un, soit les autres...
Il y a donc plusieur numero fixe par firme et un index par numero par periode
travail sous sqlserver, et la requete est a glisser dans du code c#
si il vous faut plus d'info...)
 
 
SELECT     Numero AS Numero, id1 + id2 AS index, SUM(Somme) AS montant
FROM         Total T1
WHERE     (Firme = 2) AND (type = 'SousTotal') AND (periode = 200501)
GROUP BY Numero, id1 + id2
 
Numero index              montant
35        050123500013 196,800000190735
32        050123200020 723,910004138947
28        050122800094 252891,239608841
06        050120600016 135,199998244643
16        050121600025 371,180003643036
26        050122600034 18447,18978706
30        050123000057 119537,17980618
 
 
 
+
 
SELECT     SUM(a.Somme) AS montantRetirer, a.Numero AS Numero
FROM         Total a INNER JOIN
                      Retirer b ON a.ligneH * 10 + a.ligneB = b.ligne AND a.Firme = b.Firme AND a.periode = b.periode AND b.type = 40
WHERE     (a.Firme = 2) AND (a.periode = 200501) AND (a.type = 'detail')
GROUP BY a.Numero
 
montantRetirer       Numero
318,890000343323 26
3626,94997048378 28
1606,89999461174 30
44,0499992370605 32
 
 
 
=       -----------------------------------
ce que je voudrais:  
 
Numero index              montant               montantRetirer
35       050123500013 196,800000190735  0
32       050123200020 723,910004138947  44,0499992370605
28       050122800094 252891,239608841  3626,94997048378
06       050120600016 135,199998244643  0
16       050121600025 371,180003643036  0
26       050122600034 18447,18978706     318,890000343323
30       050123000057 119537,17980618   1606,89999461174
 
Merci d'avance !

Reply

Marsh Posté le 25-02-2005 à 14:20:27   

Reply

Marsh Posté le 25-02-2005 à 14:28:32    

et voila une infos deja, ligneH+ligneB et ligne permettent de lier les enregistrement des table pour pouvoir retrouver le prix de l'achat refusé.
donc un enreg. de la table Retirer correspond toujours a un enreg. de la table Total dans laquel se trouve les prix.
 
olala ca va etre dur...

Reply

Marsh Posté le 25-02-2005 à 14:51:24    

Quel SGBD ?
 
Tu veux qu'on te fasse tout ton exo ou quoi ?
 
J'ai pas trop compris ton 2ème message ...
 
Si le SGBD permet les sous requêtes c'est trivial.
Il suffit de faire une jointure externe entre la 1ère requête et la seconde (jointure externe car la seconde requête ne renvoie pas forcément d'infos pour chaque numéro). La jointure se fait bien sur sur le numéro, élément commun des 2 requêtes.

Reply

Marsh Posté le 25-02-2005 à 15:01:33    

Beegee a écrit :

Quel SGBD ?
Il suffit de faire une jointure externe entre la 1ère requête et la seconde (jointure externe car la seconde requête ne renvoie pas forcément d'infos pour chaque numéro). La jointure se fait bien sur sur le numéro, élément commun des 2 requêtes.


 
ouep l'idée ce serait un truc dans ce goût là. Il suffirait d'utiliser un LEFT JOIN sous SQL Server pour rejoindre les tables même si il n'y pas de montantRetirer pour certains numéros. Tu vas te retrouver avec un truc du genre :
 
Numero index              montant               montantRetirer
35       050123500013 196,800000190735  NULL
32       050123200020 723,910004138947  44,0499992370605
28       050122800094 252891,239608841  3626,94997048378
06       050120600016 135,199998244643  NULL
16       050121600025 371,180003643036  NULL
26       050122600034 18447,18978706     318,890000343323
30       050123000057 119537,17980618   1606,89999461174  
 
Ensuite il faudrait utiliser la fonction coalesce qui te retourne le premier élément non null dans une liste : coalesce(SUM(a.Somme),0) As montantRetirer .
 
Voilà l'idée générale c'est ça après c'est évidemment difficile à écrire quand on ne connait pas bien le contenu des tables et la structure de la base. Mais pour toi hep8 ce sera du gâteau :D .

Reply

Marsh Posté le 25-02-2005 à 15:05:38    

sgbd : sqlserver
 
exo : ??? c quoi ca?
 
2eme msg : juste pour expliqué a quoi servent les champs ligne, c'est grace a eux qu'on peut savoir le prix de l'achat qui est mentioné dans 'Retirer' et donc faire la colonne 'montantRetire'.
 
Je vais voir ca pour la jointure externe, c'est p-e ce qu'il me faut, et ca oriente mes recherches. Merci de ta reponse!

Reply

Marsh Posté le 25-02-2005 à 15:07:33    

merci aussi Yonel je vais voir c que je peux faire de tous ca  
 :hello:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed