IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Cas Bourse, problème de requêtes SQL


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Points : 7
    Points
    7
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    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.

  3. #3
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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/

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

Discussions similaires

  1. Problème de requête SQL avec instruction TRANSFORM
    Par Nosper dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 21/06/2005, 16h15
  2. problème de requète SQL pour formulaire
    Par en_stage dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 21/06/2005, 12h21
  3. [SQL] Problème de requête SQL de plus de 8060 caractères ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 06/04/2005, 15h07
  4. [SQLserver2000][SQLServer CE] problème de requête SQL
    Par JBernn dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/01/2005, 09h29
  5. Problème de requète SQL dans un Requery
    Par Keraccess dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/10/2004, 14h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo