Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes 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 17/02/2011, 17h16   #1
Candidat au titre de Membre du Club
 
Inscription : mai 2006
Messages : 51
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 51
Points : 13
Points : 13
Par défaut Besoin d'aide sur une requête

Bonjour,


Je ne suis pas très fort en SQL , je ne sais faire que des requêtes de base et c'est pourquoi je vous sollicite.

J'ai deux tables : une table client avec ID_client (int), nom_client (varchar) et points_client (int), et une table facture avec ID_facture, ID_client, montant HT, type_facture (int ; indique si c'est un avoir ou non) (et j'en passe pour cette table).
Un client peut avoir plusieurs factures.

Ce que j'aimerais c'est que dans une seule requête j'obtienne le nombre de clients qui ont eu au moins une facture (pas de client en doublon) (jusque là je sais faire avec count(DISTINCT id_client)) avec en face (c'est là que je n'y arrive pas) la somme des points_clients uniquement pour les clients comptabilisés dans le count(DISTINCT id_client).

Exmple :
toto à 10 points et 3 factures
titi à 20 points et 1 factures
tata à 15 points et 2 factures

je dois obtenir comme résultat de mon unique requête :
nb client=3 nb points=45

Pour l'instant je n'obtient que ça :
nb client=3 (OK) nb points=80 (qui en fait est égal 3*10+1*20+2*15, somme pour chaque client du nombre de points multiplié par le nombre de ses factures )

Voici ma requête qui ne donne pas le bon résultat :

Code :
1
2
3
4
5
SELECT
  count(DISTINCT CLIENT.ID_CLIENT),
  sum(CLIENT.Points_Client)
FROM CLIENT
RIGHT OUTER JOIN FACTURE F ON CLIENT.ID_CLIENT = FACTURE.ID_CLIENT
Pouvez-vous m'aider à faire la requête juste ?

Merci d'avance.

Alf
bong03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 17h32   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Code :
1
2
3
4
5
6
7
8
9
 
 
 
SELECT C.ID_CLIENT,
SUM(C.POINTS_CLIENT) CUMUL_POINTS_CLIENT
FROM CLIENT C
   INNER JOIN FACTURE F 
      ON C.ID_CLIENT = F.ID_CLIENT
GROUP BY C.ID_CLIENT
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 17h33   #3
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Cette requete doit répondre à ton besoin :

Code sql :
1
2
3
4
5
6
7
8
9
10
 
SELECT
    COUNT(*) AS NbClients,
    SUM(C.Points_Client) AS SommePoints
FROM CLIENT C
WHERE EXISTS (
    SELECT *
    FROM FACTURE F
    WHERE F.ID_CLIENT = C.ID_CLIENT 
)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 08h34   #4
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
SELECT
COUNT(*) AS NbClients,
SUM(C.Points_Client) AS SommePoints
FROM CLIENT C
WHERE EXISTS (
SELECT *
FROM FACTURE F
WHERE F.ID_CLIENT = C.ID_CLIENT
)
Ne veut-il pas le détail des points par client:
Citation:
Exmple :
toto à 10 points et 3 factures
titi à 20 points et 1 factures
tata à 15 points et 2 factures
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 10h13   #5
Candidat au titre de Membre du Club
 
Inscription : mai 2006
Messages : 51
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 51
Points : 13
Points : 13
Super merci beaucoup !

Effectivement je ne souhaite qu'une seule ligne pour le résultat : cumul et non détail par client (ça j'y étais arrivé).

Merci encore à tous.


Alf
bong03 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 12h22.


 
 
 
 
Partenaires

Hébergement Web