Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/12/2011, 11h57   #1
Invité de passage
 
Homme
Inscription : décembre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : décembre 2011
Messages : 3
Points : 1
Points : 1
Par défaut Dupliquer des données avec une moyenne

Bonjour à tous,

je débute vraiment en SQL et j'ai une requête à écrire dont je n'arrive pas à venir à bout

Je dois extraire des données d'une table (avec des connexions vers d'autres tables) + faire une moyenne d'une de ces données et afficher le résultats de la moyenne dans une colonne x fois.

Avec l'exemple ça ira mieux:

D'une table Appels je dois extraire le nom du site appelant (via une connexion avec une autre table Site), la durée de chaque appel, l'heure de début et de fin de chaque appel ainsi que calculer la moyenne des appels pour chaque site et l'afficher dans les résultats pour chaque ligne du site concerné et c'est bien là toute la difficultée. Il me faudrait en gros l'opposé du group by car je veux reproduire x fois le résultat de ma moyenne dans une colonne.

J'ai essayé des select récursif etc.. sans succès.

Voici la forme de ma requête la plus simple:

Code :
1
2
3
SELECT site.libelle, appels.datedebut, appels.datefin, appels.duree, avg(appels.duree)
FROM site, appels
INNER JOIN site ON site.n=appels.rsite
Merci pour votre aide
debutant_sql est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 12h28   #2
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 983
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 983
Points : 1 693
Points : 1 693
Bonjour,

Déjà ta requête est fausse au niveau des jointures !! Et puis prend l'habitude de mettre ta structure des tables et ton SGBD.

Cette requête renvoie les datedebut, datefin et duree par site :
Code :
1
2
3
4
SELECT libelle, datedebut, datefin, duree
FROM appels
  JOIN site 
    ON n = rsite
Cette requête renvoie la moyenne par site :
Code :
1
2
3
4
5
SELECT libelle, avg(duree)
FROM appels
  JOIN site 
    ON n = rsite
GROUP BY libelle
A partir de là tu fais une jointure entre les tables :
Code :
1
2
3
4
5
6
7
8
9
10
SELECT site.libelle, datedebut, datefin, duree, moyenne
FROM appels
  JOIN site 
    ON n = rsite
  JOIN (SELECT libelle, avg(duree) moyenne
          FROM appels
            JOIN site 
              ON n = rsite
          GROUP BY libelle) t
    ON t.libelle = site.libelle
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 13h21   #3
Invité de passage
 
Homme
Inscription : décembre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : décembre 2011
Messages : 3
Points : 1
Points : 1
Merci lola06 pour ces précisions précieuses
Malheureusement pour le moment cette requête ne m'affiche pas la colonne moyenne mais cela m'a mis sur la bonne voie je vais maintenant pouvoir chercher pourquoi. J'avais essayé de faire des jointures de résultats de select comme tu m'as montré mais sans réel succès au moins là j'ai un exemple.

Mission: afficher cette moyenne!!

Merci encore
debutant_sql est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 13h44   #4
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 983
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 983
Points : 1 693
Points : 1 693
Que ce passe-t-il lorsque tu exécute cette requête ?
Tu as une erreur ? Pas de résultats ? ...


Code :
SELECT libelle, avg(duree) FROM appels JOIN site ON n = rsite GROUP BY libelle

Quels sont les types de tes colonnes ?
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 14h26   #5
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
Selon le SGBD on peut faire du fenêtrage pour l'aggrégation :

Code :
1
2
3
4
5
6
 
SELECT libelle, datedebut, datefin, duree,
           avg(appels.duree) over (partition BY appels.rsite)
FROM appels
  JOIN site 
    ON n = rsite
Je fais l'aggrégation par l'identifiant, ça me semble plus propre que de le faire sur un libellé (sans compter que 2 sites pourraient avoir le même libellé).
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 16h47   #6
Invité de passage
 
Homme
Inscription : décembre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : décembre 2011
Messages : 3
Points : 1
Points : 1
Merci Rei Ichido ta solution fonctionne.
lola06, quand j'exécute ta requête j'obtenais tous les résultats souhaités sans erreur sauf la colonne contenant la moyenne qui n'apparait pas.

Je vais prendre un moment pour analyser les choses et je vous donne un feedback ensuite.

Merci encore à tous les 2 pour vos réponses rapides!
Je note en résolu en attendant.
debutant_sql est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h09.


 
 
 
 
Partenaires

Hébergement Web