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 07/01/2012, 12h57   #1
Invité de passage
 
Inscription : juin 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 14
Points : 0
Points : 0
Par défaut Analyse des ventes de livres

Bonjour,

je souhaiterais votre aide pour m'aider a améliorer une requête utilisée pour le boulot.

Je précise que je n'ai accès a rien d'autre que ces requêtes, je n'ai pas accès à la partie "administrateur".

J'utilise cette requête pour analyser des ventes de livres :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT DISTINCT histo_ventes.cdpdt AS EAN
 , SUM (histo_ventes.qtevendu) AS Somme
 , (SELECT nomaut
   FROM auteur, pdt_auteur
   WHERE histo_ventes.cdpdt = pdt_auteur.cdpdt
    AND numordre = 1 AND pdt_auteur.numaut = auteur.numaut) AS Auteurs
 , libpdt AS Titres
 , (SELECT nomeditr FROM editeur
    WHERE editeur.cdeditr = produit.cdeditr) 
FROM histo_ventes
INNER JOIN produit ON histo_ventes.cdpdt = produit.cdpdt
WHERE dtvaleur BETWEEN '2010-12-01' AND '2010-12-31'
GROUP BY libpdt, histo_ventes.cdpdt
ORDER BY Somme DESC
Et celle-ci pour analyser mes stocks :

Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT cdfam
 ,(SELECT libfam FROM famille WHERE famille.cdfam = produit.cdfam)
 ,produit.cdpdt,libpdt,qtesto
 ,(SELECT nomeditr 
   FROM editeur
   WHERE editeur.cdeditr = produit.cdeditr) 
FROM produit,stock_pdt_site
WHERE produit.cdpdt = stock_pdt_site.cdpdt
 AND cdtypsto = 'D'
 AND qtesto <> 0
ORDER BY qtesto DESC
Je souhaiterais intégrer a ma requête de stocks le nom des auteurs (utilisé dans la première requête). Comment faire ?

Par avance merci de votre aide, je n'y connais rien en SQL ...
Svodoll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2012, 14h56   #2
Membre expérimenté
 
Inscription : octobre 2002
Messages : 654
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 654
Points : 554
Points : 554
Bonjour,

Citation:
je n'y connais rien en SQL ...
On s'en ai rendu compte rien qu'à lire tes requêtes.
Ce qu'il te faut c'est une jointure:
http://sqlpro.developpez.com/cours/sqlaz/jointures/

D'abord une requete strictement equivalente à ta deuxième requetes, en utilisant des jointures standard.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT   cdfam        ,
         libfam       ,
         produit.cdpdt,
         libpdt       ,
         qtesto       ,
         nomeditr
FROM     produit
         INNER JOIN stock_pdt_site
         ON       produit.cdpdt = stock_pdt_site.cdpdt
         INNER JOIN editeur
         ON       editeur.cdeditr = produit.cdeditr
         INNER JOIN famille
         ON       famille.cdfam = produit.cdfam
WHERE    cdtypsto               = 'D'
AND      qtesto                <> 0
ORDER BY qtesto DESC
Et pour avoir le nom de l'auteur en plus il y a deux jointures de plus
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT   cdfam        ,
         libfam       ,
         produit.cdpdt,
         libpdt       ,
         qtesto       ,
         nomeditr     ,
         nomaut
FROM     produit
         INNER JOIN stock_pdt_site
         ON       produit.cdpdt = stock_pdt_site.cdpdt
         INNER JOIN editeur
         ON       editeur.cdeditr = produit.cdeditr
         INNER JOIN famille
         ON       famille.cdfam = produit.cdfam
         INNER JOIN pdt_auteur
         ON       pdt_auteur.numaut = auteur.numaut
         INNER JOIN auteur
         ON       pdt_auteur.numaut = auteur.numaut
         AND      numordre          = 1
WHERE    cdtypsto                   = 'D'
AND      qtesto                    <> 0
ORDER BY qtesto DESC
Essaie de lire le tutoriel que je t'ai conseillé, et de comprendre tes requêtes et les miennes avant de continuer.
Parce que la jointure c'est quand même le b-a , ba du SQL

A+
Soazig
soazig est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2012, 15h55   #3
Invité de passage
 
Inscription : juin 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 14
Points : 0
Points : 0
merci soazig pour ta réponse.

J'ai testé aujourd'hui ta requête et elle ne fonctionne pas. J'ai le message d'erreur suivant :

Server '4', Line 1:
Adaptive Server cannot perform the requested action because column 'numaut' is not within the scope of the joined table expression. Check your command for missing or incorrect database objects, variable names, and/or input data.

Une idée ?

Par avance merci pour le coup de main.
Svodoll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 16h00   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Citation:
Envoyé par Svodoll Voir le message
merci soazig pour ta réponse.

J'ai testé aujourd'hui ta requête et elle ne fonctionne pas. J'ai le message d'erreur suivant :

Server '4', Line 1:
Adaptive Server cannot perform the requested action because column 'numaut' is not within the scope of the joined table expression. Check your command for missing or incorrect database objects, variable names, and/or input data.

Une idée ?

Par avance merci pour le coup de main.
Bonjour,

Vous avez donc seulement executé sa proposition, puis copié / collé ici le message d'erreur ?

Lisez 30 seondes la requête, regardez le descriptif de vos tables (le noms des colonnes en particulier), le message d'erreur et vous trouverez d'où vient le problème...
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 16h02   #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
Citation:
Envoyé par soazig Voir le message
D'abord une requete strictement equivalente à ta deuxième requetes, en utilisant des jointures standard.
Ce n'est pas "strictement" équivalent : pour ça il faudrait utiliser des LEFT OUTER JOIN, car la requête initiale (utilisant des requêtes scalaires) ramènera les lignes même si la requête scalaire ne ramène que NULL.
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 16h47   #6
Invité de passage
 
Inscription : juin 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 14
Points : 0
Points : 0
Citation:
Envoyé par punkoff Voir le message
Bonjour,

Vous avez donc seulement executé sa proposition, puis copié / collé ici le message d'erreur ?

Lisez 30 seondes la requête, regardez le descriptif de vos tables (le noms des colonnes en particulier), le message d'erreur et vous trouverez d'où vient le problème...
Le problème est que je n'ai pas accès a tout cela, j'ai juste mes requêtes. et je n'y connais absolument rien en sql, d’où ma demande d'aide ...
Svodoll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 17h03   #7
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Soit, votre erreur est spécifique à sybase qui ne permet pas de référencer, dans les jointures, une colonne d'une table jointe présente dans une jointure qui se situe après son rang de jointure (je sais pas si c'est clair ?).

Là en l’occurrence si on reprend la requête de Soazig :
Code :
1
2
3
4
5
6
7
8
 
......
         INNER JOIN pdt_auteur
          ON       pdt_auteur.numaut = auteur.numaut
         INNER JOIN auteur
          ON       pdt_auteur.numaut = auteur.numaut
          AND      numordre          = 1
...
Cette jointure est donc rejetée car on fait une jointure sur auteur.numaut alors que cette colonne appartient à la table auteur.

Ceci implique en fait qu'il y a effectivement un problème avec la requête de Soazig car elle ne fait pas une jointure correct avec la table pdt_auteur.
Il faudrait plutôt faire la jointure entre cette table et la table produit.


Je vous laisse recouper avec votre 1ere requête pour trouver les colonnes de jointures.

edit: et par la même occasion vous pourriez aussi mettre en place la remarque de Rei Ichido qui était pertinente.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 22h17   #8
Membre expérimenté
 
Inscription : octobre 2002
Messages : 654
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 654
Points : 554
Points : 554
bonjour,
Voilà j'ai corrigé mon erreur et mis des jointures externes.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
SELECT   cdfam        ,
         libfam       ,
         produit.cdpdt,
         libpdt       ,
         qtesto       ,
         nomeditr     ,
         nomaut
FROM     produit
         INNER JOIN stock_pdt_site
         ON       produit.cdpdt = stock_pdt_site.cdpdt
         LEFT OUTER JOIN editeur
         ON       editeur.cdeditr = produit.cdeditr
         INNER JOIN famille
         ON       famille.cdfam = produit.cdfam
         LEFT OUTER JOIN pdt_auteur
         ON        histo_ventes.cdpdt = pdt_auteur.cdpdt
         LEFT OUTER JOIN auteur
         ON       pdt_auteur.numaut = auteur.numaut
         AND      numordre          = 1
WHERE    cdtypsto                   = 'D'
AND      qtesto                    <> 0
ORDER BY qtesto DESC
parce que je n'aime pas poster des âneries, mais j'aimerais bien que Svodoll tu essaies de comprendre ces requêtes.
Citation:
je n'y connais absolument rien en sql,
Oui mais quel est ton job?
Pourquoi dois tu corriger cette requête.
Il faudra peut-être que tu apprennes le sql, car tu ne trouveras pas toujours une brave c... pour faire tes requêtes à ta place.
Pour apprendre le sql le site que je t'ai cité est un bon début, y as-tu jeté un coup d'oeil, ou as-tu attendu qu'on te donne la réponse ?

D'un autre côté si tu n'auras jamais d'autres requêtes à faire, on peut en rester là.
A+
Soazig
soazig est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2012, 23h16   #9
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Suffit de regardez l'historique de ses msg pour comprendre qu'il n'en a strictement rien a foutre de cette partie de son job, et utilise les forums pour réaliser son taf +
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2012, 07h09   #10
Invité de passage
 
Inscription : juin 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 14
Points : 0
Points : 0
merci pour vos réponses.

En effet, je ne suis pas supposé utiliser sql dans mon boulot, d'ou mon absence de formation a ce sujet. Je l'utilise extrêmement ponctuellement, mais cela n'est pas mon travail.

Je vais néanmoins suivre vos conseils et lire les lien que vous m'avez mis en copie.

Encore merci pour votre aide.
Svodoll 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 04h37.


 
 
 
 
Partenaires

Hébergement Web