IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

[Oracle10g] Problème Group by


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 20
    Points : 17
    Points
    17
    Par défaut [Oracle10g] Problème Group by
    Bonjour à tous,

    Je travaille sur les tables suivantes :

    division(id_division, ...)
    service(id_service, id_division, ...)
    employe(id_employe, id_service, id_abonnement, ...)
    abonnement(id_abonnement, cout_abonnement, ...)
    facture(id_facture, id_employe, ...)
    appel(id_appel, id_facture, duree_appel, cout_appel, ...)

    J'essaye d'obtenir pour une division donnée, le coût cumulé et la durée cumulée des appels pour chaque service.

    Pour le calcul du coût, le coût d'un appel vaut 0 dans le cadre de son abonnement ou une valeur positive pour du hors forfait. Il reste ensuite à rajouter le prix des différents abonnements.

    J'ai un début de requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    select
    	s.id_service,
    	s.nom,
    	sum(a.duree_appel) as duree_cumulee,
    	(count(distinct f.id_facture) * ab.cout_bonnement + round(sum(a.cout_appel), 2)) as cout_cumule
    from
    	pjt_service s
    		inner join pjt_division d
    			on d.id_division = s.id_division
    		inner join pjt_employe e
    			on e.id_service = s.id_service
    		inner join pjt_facture f
    			on f.id_employe = e.id_employe
    		inner join pjt_appel a
    			on a.id_facture = f.id_facture
    		inner join pjt_abonnement ab
    			on ab.id_abonnement = e.id_abonnement
    where
    	d.id_division = 1
    group by
    	s.id_service,
    	s.nom,
    	ab.cout_abonnement;
    et j'obtiens le résultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ID_SERVICE NOM                            DUREE_CUMULEE COUT_CUMULE
    ---------- ------------------------------ ------------- -----------
             1 Développement                         796241     3508,13
             2 Communication                         847973     3056,19
             2 Communication                         814711     2351,82
    Le résultat est correct, mais j'ai besoin de grouper les lignes qui appartiennent au même service... Dans cette requête, je suis obligé de faire un regroupement sur le coût de l'abonnement pour que ma requête reste valide, d'où les différentes lignes pour un même service...

    Si quelqu'un à une idée, je suis preneur!

    Merci d'avance!

    Olivier

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Oui, faites une somme autour de votre requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    WITH PreCalcul AS
    (
    SELECT
    	s.id_service,
    	s.nom,
    	sum(a.duree_appel) AS duree_cumulee,
    	(count(DISTINCT f.id_facture) * ab.cout_bonnement + round(sum(a.cout_appel), 2)) AS cout_cumule
    FROM
    	pjt_service s
    		INNER JOIN pjt_division d
    			ON d.id_division = s.id_division
    		INNER JOIN pjt_employe e
    			ON e.id_service = s.id_service
    		INNER JOIN pjt_facture f
    			ON f.id_employe = e.id_employe
    		INNER JOIN pjt_appel a
    			ON a.id_facture = f.id_facture
    		INNER JOIN pjt_abonnement ab
    			ON ab.id_abonnement = e.id_abonnement
    WHERE
    	d.id_division = 1
    GROUP BY
    	s.id_service,
    	s.nom,
    	ab.cout_abonnement
    )
    SELECT
        pc.id_service,
        pc.nom,
        sum(pc.duree_cumulee) as duree_cumulee,
        sum(pc.cout_cumule) as cout_cumule
    FROM 
        PreCalcul pc
    GROUP BY
        pc.id_service,
        pc.nom;

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    ça marche impec, merci beaucoup!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème Group by
    Par tollaire dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/08/2007, 09h51
  2. SharePoint 2007 - Problème groupes et permissions
    Par Najla dans le forum SharePoint
    Réponses: 3
    Dernier message: 20/03/2007, 22h42
  3. Problème group by
    Par nellynew dans le forum Langage SQL
    Réponses: 7
    Dernier message: 19/01/2007, 15h28
  4. [SQL] Problème group by sur view
    Par helene34 dans le forum Oracle
    Réponses: 2
    Dernier message: 04/01/2007, 08h25
  5. Problème Group By
    Par Fishes83 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 03/01/2007, 13h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo