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 11/01/2012, 01h07   #1
Invité de passage
 
Homme Patrick Portefaix
Responsable de service informatique
Inscription : novembre 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme Patrick Portefaix
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Conseil

Informations forums :
Inscription : novembre 2011
Messages : 6
Points : 3
Points : 3
Par défaut Cas Bourse, problème de requêtes SQL

Bonjour,
Je rencontre un problème pour écrire les requêtes SQL d'un cas d'étude.
L'énoncé est le suivant:
On a 2 tables Coursactions(nomaction,jour, valeurouverture, valeurfermeture) et Météo(jour, pluie).
La table Coursactions recense pour chaque jour et pour chaque action la valeur d'ouverture et la valeur de fermeture.
La table Météo donne pour chaque jour l'intensité de pluie ('sans', 'faible', 'moyenne', 'forte').

La première requête qui me pose problème est la liste des actions qui montent chaque jour de forte pluie.
J'arrive à avoir la liste des actions qui montent une jour de forte pluie, mais je n'arrive pas à isoler celles qui ne montent QUE les jours de forte pluie.
Code :
1
2
3
SELECT COURSACTIONS.NOMACTION, COURSACTIONS.JOUR, COURSACTIONS.VALEUROUVERTURE, COURSACTIONS.VALEURFERMETURE, METEO.PLUIE
FROM COURSACTIONS LEFT JOIN METEO ON COURSACTIONS.JOUR = METEO.JOUR
WHERE METEO.PLUIE="FORTE" AND COURSACTIONS.VALEURFERMETURE>COURSACTIONS.VALEUROUVERTURE
Je pense qu'il y a une solution basée sur les vues, ou avec une opération ensembliste MINUS, mais je n'arrive pas à bonne syntaxe.

La deuxième question qui me bloque est l'action qui a monté le plus (en proportion) hier.
La encore j'arrive à avoir la liste des actions qui ont monté hier avec la proportion mais je n'arrive pas à extraire celle qui a la proportion la plus forte
Code :
1
2
3
SELECT HIER.NOMACTION, HIER.JOUR, HIER.VALEURFERMETURE, TODAY.NOMACTION, TODAY.JOUR, TODAY.VALEURFERMETURE, ((TODAY.VALEURFERMETURE/HIER.VALEURFERMETURE)*100)
FROM COURSACTIONS TODAY, COURSACTIONS HIER
WHERE HIER.NOMACTION=TODAY.NOMACTION AND HIER.JOUR=(TODAY.JOUR-1) AND TODAY.JOUR=#2003-11-11# AND TODAY.VALEURFERMETURE>HIER.VALEURFERMETURE
Mon jeu de données est le suivant:
NOMACTION	JOUR	VALEUROUVERTURE	VALEURFERMETURE
PEUGEOT	11/09/2001	100	50
PEUGEOT	10/11/2003	100	140
PEUGEOT	11/11/2003	100	150
PEUGEOT	12/11/2003	130	150
RENAULT	11/09/2001	100	120
RENAULT	09/11/2003	120	130
RENAULT	10/11/2003	120	130
RENAULT	11/11/2003	120	140
RENAULT	12/11/2003	130	150
RENAULT	13/11/2003	150	90
RENAULT	14/11/2003	90	130
RENAULT	15/11/2003	130	130
RENAULT	16/11/2003	130	125
RENAULT	17/11/2003	125	130
TEST	10/11/2003	80	110
TEST	11/11/2003	90	100

JOUR	PLUIE
10/11/2003	FORTE
11/11/2003	SANS
12/11/2003	FAIBLE
13/11/2003	SANS
16/11/2003	FORTE
Votre aide sera la bienvenue.
Cordialement
Shrek92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 08h31   #2
Membre émérite
 
Homme Tony
Développeur .NET
Inscription : novembre 2010
Messages : 570
Détails du profil
Informations personnelles :
Nom : Homme Tony
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2010
Messages : 570
Points : 821
Points : 821
Bonjour,

pour la première il suffit d'ajouter un not exists dans lequel tu cherche si l'action monte les jours de pluie <> FORTE

pour le seconde requête, tu peux le faire en utilisant un max aussi avec sous requête, mais tu peux aussi le faire avec un not exists dans lequel tu cherches les actions ayant en proportion une meilleurs progression.
__________________
Le Porc est un loup pour le Porc.
asmduty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 08h42   #3
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Salut !

Citation:
Envoyé par Shrek92 Voir le message
Bonjour,
La premère requête qui me pose problème est la liste des actions qui montent chaque jour de forte pluie.
J'arrive à avoir la liste des actions qui montent une jour de forte pluie, mais je n'arrive pas à isoler celles qui ne montent QUE les jours de forte pluie.
Avant tout, la liste des action qui montent chaque jour de forte pluie, ce n'est pas la même chose que "isoler celles qui ne montent QUE les jours de forte plus".

L'une se dit : {Action, quelque soit jour, (pluie = forte) => (action.coursdeb < action.coursfin)}
La seconde se dit : {Action, quelque soit jour, (action.coursdeb < action.coursfin) => (pluie = forte) }

Bref, on va supposer que c'est le premier énoncé qui est le bon.

Effectivement, tu peux utiliser MINUS pour faire la différence ensembliste entre les actions (toutes), et celles qui baissent certains jour de pluie forte.

Ca serait alors :
Code :
1
2
3
4
5
6
7
8
9
 
SELECT COURSACTIONS.NOMACTION
FROM COURSACTIONS
MINUS
SELECT COURSACTIONS.NOMACTION
FROM COURSACTIONS
  JOIN METEO ON COURSACTIONS.JOUR = METEO.JOUR
WHERE METEO.PLUIE="FORTE" 
  AND COURSACTIONS.VALEURFERMETURE < COURSACTIONS.VALEUROUVERTURE
Tu noteras la transformation du prédicat : "ça monte chaque fois qu'il pleut fort" en "il n'y a pas de jours de forte pluie ou ça baisse"... ce que tu peux aussi transcrire avec du NOT IN ou NOT EXISTS

Pour la deuxième question, il faut que tu regardes comment agréger avec les fonctions min, max: ça permet de chercher le max, le min d'une grandeur (donc ta variation relative). Tu pourras utiliser se résultat pour faire la jointure avec la requête que tu nous as proposée pour ne garder que les actions correspondant à ce max de variation.
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 14h32   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
J'ai déjà vu cette histoire de bourse et de pluie il y a pas mal de mois, peut-être un an ou deux.
Fas une recherche dans tout le forum base de données.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2012, 22h42   #5
Invité de passage
 
Homme Patrick Portefaix
Responsable de service informatique
Inscription : novembre 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme Patrick Portefaix
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Conseil

Informations forums :
Inscription : novembre 2011
Messages : 6
Points : 3
Points : 3
Merci Cinefil. J'avais pourtant cherché. Je ne sais pas comment j'ai pu le rater... Mais de toute façon il n'y avais pas la réponse à mes 2 questions.
Le cas Bourse comporte 15 questions. Les miennes étaient la 9 et la 14, celle de Jedébute et... était la question 5. Pour référence...

Merci à pacmann et à asmduty pour leur aide.
J'ai compris l'utilisation du NOT IN dans ma première question.
Pour la deuxième question, une requête qui marche est:
Code :
1
2
3
4
5
SELECT TODAY.NOMACTION, (TODAY.VALEURFERMETURE/HIER.VALEURFERMETURE)*100
FROM COURSACTIONS TODAY, COURSACTIONS HIER
WHERE HIER.NOMACTION=TODAY.NOMACTION AND HIER.JOUR=(TODAY.JOUR-1) AND TODAY.JOUR=#2003-11-11# AND (TODAY.VALEURFERMETURE/HIER.VALEURFERMETURE)*100 = (SELECT MAX(((TODAY.VALEURFERMETURE/HIER.VALEURFERMETURE)*100))
FROM COURSACTIONS TODAY, COURSACTIONS HIER
WHERE HIER.NOMACTION=TODAY.NOMACTION AND HIER.JOUR=(TODAY.JOUR-1) AND TODAY.JOUR=#2003-11-11# AND TODAY.VALEURFERMETURE>HIER.VALEURFERMETURE)
Effectivement, en "comparant" la valeur d'augmentation à l'a valeur d'augementation maximum on y arrive.
J'ai rendu mon devoir ce soir. Encore merci de votre aide!
Shrek92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 09h20   #6
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
Bonjour,

Concernant votre 2eme requête une autre approche est possible, en utilisant les fonctions de fenêtrage http://sqlpro.developpez.com/article...clause-window/

Code :
1
2
3
4
5
6
7
8
9
10
11
 
WITH tmp AS (
SELECT TODAY.NOMACTION, TODAY.VALEURFERMETURE/HIER.VALEURFERMETURE * 100,
rank() over(partition BY TODAY.NOMACTION ORDER BY TODAY.VALEURFERMETURE/HIER.VALEURFERMETURE DESC) AS rnk
FROM COURSACTIONS TODAY
INNER JOIN COURSACTIONS HIER ON HIER.NOMACTION=TODAY.NOMACTION AND HIER.JOUR=(TODAY.JOUR-1)
WHERE TODAY.JOUR=#2003-11-11#)
 
SELECT *
FROM tmp 
WHERE rnk = 1
punkoff 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 22h45.


 
 
 
 
Partenaires

Hébergement Web