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 05/10/2011, 10h17   #1
Invité de passage
 
Aziz Aziz
Inscription : février 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Aziz Aziz

Informations forums :
Inscription : février 2011
Messages : 16
Points : 1
Points : 1
Par défaut Requête SQL difficile

Bonjour,

je dois écrire une requête sql sur une table à deux colonnes ( mais la requête est complexe pour mon niveau), je m'explique :

j'ai 2 colonnes Id_Produit et Id_Client ( un client achète un ou plusieurs produits..et un produit est acheté par un ou plusieurs clients).

je souhaite avoir : pour chaque Id_Produit, le nombre de client qui ont acheté uniquement ce produit et pas du tout les autres.

Merci bien d'avance

Cordialement

Aziz
WIN01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 10h28   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
Comme plein de discussions (hier par exemple).
Il serait judicieux avant de poster une nouvelle discussion de lire les cours et tutoriaux disponibles sur le site.

Ci joint les liens fournis par Punkoff
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 10h32   #3
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Bonjour,


Quel est le SGBD ?
__________________
Cordialement.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 10h33   #4
Membre éclairé
 
Avatar de boussafi
 
Homme
Ingénieur développement logiciels
Inscription : septembre 2007
Messages : 342
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : septembre 2007
Messages : 342
Points : 397
Points : 397
Envoyer un message via Yahoo à boussafi Envoyer un message via Skype™ à boussafi
avoir comprendre MERISE d'abord
boussafi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 10h56   #5
Invité de passage
 
Aziz Aziz
Inscription : février 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Aziz Aziz

Informations forums :
Inscription : février 2011
Messages : 16
Points : 1
Points : 1
re-Bonjour,

il s'agit du SGBD oracle.

Merci ORA-007 :-)
WIN01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 11h00   #6
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 958
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 958
Points : 17 789
Points : 17 789
Citation:
Envoyé par WIN01 Voir le message
j'ai 2 colonnes Id_Produit et Id_Client ( un client achete un ou plusieurs produits..et un produit est acheté par un ou plusieurs clients).

je souhaite avoir : pour chaque Id_Produit, le nombre de client qui ont acheté uniquement ce produit [U]et pas dutout les autres[/U
Jeu d'essais :
Code :
1
2
3
CREATE TABLE T
(Id_Produit INT,
 Id_Client  INT)
Solution :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
WITH T0 AS
(
SELECT Id_Client, Id_Produit  
FROM   T AS T1
WHERE  Id_Produit  = ??? --> n° du produit visé
  AND NOT EXIST(SELECT 0
                FROM   T AS T2
                WHERE  T1.Id_Client  = T2.Id_Client  
                  AND  T1.(Id_Produit <> T2.(Id_Produit))
SELECT T0.*, COUNT(*) AS NOMBRE_PRODUITS
FROM   T0
       INNER JOIN T
             ON T0.Id_Produit = T.Id_Produit 
                AND T0.Id_Client  = T.Id_Client

Et pour un cours sur SQL : mon site + mon bouquin !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 11h03   #7
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Bonjour,

dans ce cas là alors :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
WITH ACHAT AS
(
SELECT 1 AS ID_CLIENT, 1 AS ID_PRODUIT FROM DUAL UNION ALL
SELECT 1             , 2               FROM DUAL UNION ALL
SELECT 2             , 1               FROM DUAL UNION ALL
SELECT 3             , 1               FROM DUAL
)
SELECT COUNT(t1.ID_CLIENT)
FROM   ACHAT t1
WHERE  1=1
AND    t1.ID_PRODUIT = 1
AND    NOT EXISTS (
                  SELECT 1
                  FROM ACHAT t2 
                  WHERE t2.ID_PRODUIT <> t1.ID_PRODUIT
                  AND   t2.ID_CLIENT  = t1.ID_CLIENT
                  )
;
__________________
Cordialement.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 11h17   #8
Invité de passage
 
Aziz Aziz
Inscription : février 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Aziz Aziz

Informations forums :
Inscription : février 2011
Messages : 16
Points : 1
Points : 1
Merci bien Grégoire.

cela renvoie bien pour chaque Id_Produit le nombre de clients ayant acheté uniquement ce produit?

je n'ai pas encore eu les résultats des tests car c'est pour un ami en stage (débutant sur SQL.. ), je vais lui envoyer la requête.

Encore une fois merci.
WIN01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 11h18   #9
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Vos requêtes ne répondent pas au besoin !
Code :
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
WITH SR1 AS
(
SELECT 1 AS id_produit, 1 AS id_client FROM dual union ALL
SELECT 2              , 1              FROM dual union ALL
SELECT 2              , 2              FROM dual union ALL
SELECT 2              , 3              FROM dual union ALL
SELECT 3              , 3              FROM dual union ALL
SELECT 4              , 4              FROM dual union ALL
SELECT 5              , 1              FROM dual union ALL
SELECT 5              , 5              FROM dual union ALL
SELECT 5              , 6              FROM dual
)
  ,  SR2 AS
(
  SELECT id_client, min(id_produit) AS id_produit
    FROM SR1
GROUP BY id_client
  HAVING count(DISTINCT id_produit) = 1
)
  SELECT prd.id_produit, count(SR2.id_client) AS nb_clients_unique
    FROM SR2
         RIGHT OUTER JOIN (SELECT DISTINCT id_produit FROM SR1) prd
           ON prd.id_produit = SR2.id_produit
GROUP BY prd.id_produit
ORDER BY prd.id_produit ASC;
 
ID_PRODUIT NB_CLIENTS_UNIQUE
---------- -----------------
         1                 0
         2                 1
         3                 0
         4                 1
         5                 2
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 11h38   #10
Invité de passage
 
Aziz Aziz
Inscription : février 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Aziz Aziz

Informations forums :
Inscription : février 2011
Messages : 16
Points : 1
Points : 1
Merci bien Waldar : )
WIN01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h05.


 
 
 
 
Partenaires

Hébergement Web