sommes multiple

sommes multiple - SQL/NoSQL - Programmation

Marsh Posté le 13-04-2004 à 14:22:07    

Salut.
 
J'ai deux tables avec les champs suivant : opérateur,produit,mois et duré. Je veux afficher la somme des  durées par opérateur, par produit et par mois.
 
Seulement voilà pour l'opérateur x, le produit y et le mois z, j'ai trois lignes dans la première table et une seule dans la seconde. La requete me retourne la somme des durées des trois lignes de la table 1 (c'est ok!) mais 3*durée de la ligne de la table 2 !!!
 
OPÉRATEUR MOIS     PRODUIT      DURÉE
--------- -------- ------- ----------
GBBT      31/05/03 IDTF          6000
GBBT      31/05/03 IDTF          6000
GBBT      31/05/03 IDTF          6000
 
*
table 2 :
 
OPÉRA MOIS     PRODU      DURÉE
----- -------- ----- ----------
GBBT  31/05/03 IDTF        3000 <---------------------|
                                                      |
la requete retourne :                                 |
                                                      |
OPÉRATEUR MOIS     PRODUIT DURÉE 1 DURÉE 2            |
--------- -------- ------- ------- -------            |
GBBT      31/05/03    IDTF    6000    9000 <----------|
 
Comment faire pour ne pas re sommer une ligne déjà parcourue?
 
Merci, à +.

Reply

Marsh Posté le 13-04-2004 à 14:22:07   

Reply

Marsh Posté le 13-04-2004 à 18:19:33    

donne nous les requêtes !
 
et tu utilises quoi ? Oracle ? MySql ?
 
Les durées que tu devrais avoir dans ton exemple sont 18000 et 3000, c'est ça ?
 
Si tu peux, il ne faut pas faire de jointure directe entre table1 et table2 puisqu'apparemment il te faut les sommes des durées dans les 2 tables séparément ...
Donc qqch comme :

Code :
  1. SELECT result1.operateur, result1.mois, result1.produit, result1.duree1, result2.duree2
  2. FROM (SELECT operateur, mois, produit, sum(table1.duree) as duree1
  3.       FROM table1
  4.       GROUP BY operateur, mois, produit) resultat1,
  5.      (SELECT operateur, mois, produit, sum(table1.duree) as duree2
  6.       FROM table2
  7.       GROUP BY operateur, mois, produit) resultat2
  8. WHERE resultat1.operateur = resultat2.operateur
  9. AND resultat1.mois= resultat2.mois
  10. AND resultat1.produit= resultat2.produit;


Message édité par Beegee le 13-04-2004 à 18:19:52
Reply

Marsh Posté le 13-04-2004 à 19:02:43    

Je travaille avec Oracle. Les durées que je devrai avoir sont 6000 (j'ai oublié un - : 6000+6000-6000=6000) et 3000
 
Voici la requete :
 
select network_operator_id,last_day(traffic_date),product_id,sum(duration) Registred,sum(unit_count) Declared
from daily_summary,posted_account_entry
where network_operator_id=FEEDER_CUST_CODE
and PRODUCT_ID=PROD_LINE
and PRODUCT_ID='IDTF'
and CALL_DATE >= '01/05/2003'
and CALL_DATE <= '31/05/2003'
and last_day(call_date)=last_day(traffic_date)
and NETWORK_OPERATOR_ID = 'GBBT'
group by network_operator_id,last_day(traffic_date),product_id
;
 
Résultat :  
 
NETWO LAST_DAY PROD  REGISTRED   DECLARED
----- -------- ---- ---------- ----------
GBBT  31/05/03 IDTF       6000       9000
 
Au lieu de  
 
NETWO LAST_DAY PROD  REGISTRED   DECLARED
----- -------- ---- ---------- ----------
GBBT  31/05/03 IDTF       6000       3000
 
Je vais essaier d'enlever les jointures.
 

Reply

Marsh Posté le 14-04-2004 à 11:00:00    

tu peux essayer d'utiliser la requête que je t'ai mise au-dessus, avec les bons noms de champs, et me dire ce que ça donne ?
 
L'idée est de faire les sommes indépendamment pour les 2 tables, et ensuite, de joindre les 2 sommes par rapport aux clés ;)
 
Le plus simple pour écrire ce genre de requêtes est de les écrire séparément (tu écris d'abord la requête qui utilise seulement la table 1, puis celle de la table 2) et des les grouper ensuite. Surtout que tu utilises Oracle, qui permet l'utilisation de requêtes imbriquées (pas comme mySql, sur lequel je galère un peu car j'ai utilisé qu'Oracle jusqu'à maintenant ! :lol: )

Reply

Marsh Posté le 14-04-2004 à 13:27:38    

En fait, la base de données est une bd Oracle, mais j'utilise BusinessObjects pour créer un rapport :pt1cable: . Donc, je vais voir si ta requête est faisable en BO ou sous Designer.
 
Sous SQL*+, un message me dit que le group by n'est pas à la bonne place!!! :sweat:

Reply

Marsh Posté le 14-04-2004 à 19:08:42    

Bon, j'ai essayé ton truc :  
 
SELECT result1.network_operator_id,result1.month,result1.product_id, result1.durée1, result2.durée2  
  FROM (SELECT network_operator_id,last_day(call_date) as month, product_id, sum(duration) as durée1  
        FROM daily_summary  
        GROUP BY network_operator_id, last_day(call_date), product_id) result1,  
       (SELECT feeder_cust_code,last_day(traffic_date) as month, prod_line, sum(unit_count) as durée2  
        FROM posted_account_entry  
        GROUP BY feeder_cust_code,last_day(traffic_date) , prod_line) result2  
  WHERE result1.network_operator_id = result2.feeder_cust_code
  AND result1.month=result2.month
  AND result1.product_id= result2.prod_line
  AND result1.network_operator_id = 'GBBT'
  AND result1.product_id= 'IDTF';  
 
et ça marche admirablement :jap: merci énormément. Seulement voilà, je dois intégrer ça dans le Business Objects :pt1cable: !!!
 
BOn, j'essaie et on verra bien.

Reply

Marsh Posté le 16-04-2004 à 11:18:48    

Salut.
 
Je trouve toujours pas de solution pour faire une telle requête avec BO. Comment je dois faire????
 
Heeeeeeeeeelp!!!

Reply

Marsh Posté le 26-04-2004 à 18:06:45    

:pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:

Reply

Sujets relatifs:

Leave a Replay

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