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

Requêtes MySQL Discussion :

Problème Création vue


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mars 2007
    Messages : 129
    Points : 97
    Points
    97
    Par défaut Problème Création vue
    Bonjour à tous

    J'ai une requête assez complexe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    SELECT a.debut AS 'date', b.id AS 'produit_id', c.open AS 'open', e.min AS min, e.max AS max, d.close AS 'close' FROM Dates_Semaines AS a
    JOIN Produit AS b
    JOIN Cotations_Daily as c ON c.date = (
      SELECT date FROM  Cotations_Daily WHERE date >= a.debut ORDER BY date ASC LIMIT 1
    ) AND c.produit_id = b.id
    JOIN Cotations_Daily as d ON d.date = (
      SELECT date FROM  Cotations_Daily WHERE date <= a.fin ORDER BY date DESC LIMIT 1
    ) AND d.produit_id = b.id
    JOIN (
      SELECT MAX(max) AS max, MIN(min) AS min, debut 
      FROM Cotations_Daily 
      JOIN Dates_Semaines
      ON Cotations_Daily.date BETWEEN debut AND fin
      GROUP BY debut
      ORDER BY debut
    ) e ON e.debut = a.debut
    Quand j'essaye de créer une vue (car c'est ça le but de cette requête) :
    View's SELECT contains a subquery in the FROM clause

    Pourriez-vous m'aider à reformuler la requête car je ne comprends pas d'où vient l'erreur

    la table Cotations_Daily contient les valeurs de bourse des cours des différentes actions ; prix à l'ouverture le matin, prix à la clôture le soir, plus haut du jour, et plus bas du jour (respectivement open, close, max, min)

    La table Dates_Semaines contient tous les couples Lundi/Dimanche du 01/01/2000 au 31/12/2020.
    Elle me sert à délimiter les semaines.
    Il y a peut-être un meilleur moyen de faire ça, mais c'est le seul que j'ai trouvé

    Ce que je souhaite faire avec ma requête, c'est une vue qui, à l'aide des valeurs journalière, me m'affiche les mêmes valeurs, mais en hebdomadaire.

  2. #2
    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
    Le message est clair : ton SGBD interdit une sous-requête dans une vue.
    C'est le mauvais MySQL ?

    Quant à ta requête, tu devrais expliquer ton besoin parce que j'ai du mal à la comprendre !

    J'ajoute que tu ne devrais pas nommer les colonnes de mots réservés du langage SQL (MIN, MAX par exemple).
    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 !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mars 2007
    Messages : 129
    Points : 97
    Points
    97
    Par défaut
    Comment ça "c'est le mauvais MySQL" ? je ne comprends pas ta question

    En fait, je travaille les cours de bourse, et calcule différentes choses (moyennes, médiane, ...)

    J'ai donc une table mise à jur quotidiennement qui contient les prix de toutes les actions : la date, l'id de l'action, le prix d'ouverture, le prix à la fermeture (de la bourse) le plus haut prix de jour, et le plus bas prix du jour.

    Maintenant, je souhaite construire une vue qui affichera les mêmes informations, mais de façon hebdomadaire, et non journalière. Je veux donc que ma vue m'affiche : la date (donc celle du lundi), le prix d'ouverture (le lundi matin) le prix de fermeture (le vendredi soir) le plus haut de la semaine, et le plus bas de la semaine.

    C'est ce que fait ma requette, mais j'aimerai que ça soit affiché par une vue et non une requette pour pouvoir travailler plus facilement sur les valeurs

  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
    Comment ça "c'est le mauvais MySQL" ? je ne comprends pas ta question
    Quand j'ai tapé ma réponse, je croyais que la discussion était dans le forum "Langage SQL".

    Et mauvais MySQL parce qu'il est mauvais. En l'occurrence, avec un autre SGBD, tu aurais pu utiliser des fonctions analytiques que MySQL ne connaît pas.

    une vue qui affichera les mêmes informations, mais de façon hebdomadaire
    Tu veux la synthèse hebdomadaire, c'est à dire le cours d'ouverture du premier jour de la semaine, le cours de fermeture de la semaine, le plus haut de la semaine et le plus bas de la semaine ?

    Puisque les sous-requêtes sont interdites dans les vues chez le mauvais MySQL, Tu vas avoir besoin de plusieurs vues.

    1) Vue pour les cours mini et maxi de chaque semaine pour chaque produit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE VIEW v_min_max_hebdo AS
    SELECT
    	cd.produit_id,
    	ds.debut AS date_debut_semaine,
    	MAX(cd.`max`) AS plus_haut_semaine,
    	MIN(cd.`min`) AS plus_bas_semaine
    FROM Cotations_Daily cd
    INNER JOIN Dates_Semaines ds ON cd.`date` BETWEEN ds.debut AND ds.fin
    GROUP BY cd.produit_id, ds.debut, ds.fin
    2) Vue pour déterminer les dates de première et dernière cotation de chaque semaine pour chaque produit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE VIEW v_dates_debut_fin_semaines_par_produit AS
    SELECT
    	cd1.produit_id,
    	ds.debut AS date_debut_semaine,
    	MIN(cd1.`date`) AS jour_premiere_cotation,
    	MAX(cd2.`date`) AS jour derniere_cotation
    FROM Dates_Semaines ds
    INNER JOIN Cotations_Daily cd1 ON cd1.`date` >= ds.debut
    INNER JOIN Cotations_Daily cd2 ON cd2.`date` <= ds.fin
    WHERE cd1.produit_id = cd2.produit_id
    GROUP BY cd1.produit_id, ds.debut
    3) Vue finale des statistiques hebdomadaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    CREATE VIEW v_stats_hebdo_par_produit AS
    SELECT
    	v1.produit_id,
    	v1.debut AS date_debut_semaine,
    	cd1.`open` AS cours_ouverture_semaine,
    	cd2.`close` AS cours_fermeture_semaine,
    	v2.plus_haut_semaine,
    	v2.plus_bas_semaine
    FROM v_dates_debut_fin_semaines_par_produit v1
    INNER JOIN Cotations_Daily cd1
    	ON cd1.`date` = v1.jour_premiere_cotation
    	AND cd1.produit_id = v1.produit_id
    INNER JOIN Cotations_Daily cd2
    	ON cd2.`date` = v1.jour derniere_cotation
    	AND cd2.produit_id = v1.produit_id
    INNER JOIN v_min_max_hebdo v2
    	ON v2.produit_id = v1.produit_id
    	AND v2.debut = v1.debut
    WHERE cd1.produit_id = cd2.produit_id
    ORDER BY v1.produit_id, v1.debut
    À essayer.

    Au passage, remarque toutes les colonnes que tu as mal nommées, entourées d'apostrophes inversées pour éviter les confusions et apparaissant en rouge dans la requête.
    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
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Si ça fonctionne, ça me semble plus simple comme ceci (Que deux vues et pas de table Dates_Semaines ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE VIEW v_min_max_hebdo AS
    SELECT
        cd.produit_id,
        MIN(cd.`date`) as date_debut_semaine,
        MAX(cd.`date`) as date_fin_semaine,
        MAX(cd.`max`) AS plus_haut_semaine,
        MIN(cd.`min`) AS plus_bas_semaine
    FROM Cotations_Daily cd
    GROUP BY cd.produit_id,YEARWEEK(cd.`date`)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CREATE VIEW v_stats_hebdo_par_produit AS
    SELECT 
        v1.produit_id,
        v1.date_debut_semaine,
        cd1.`open` AS cours_ouverture_semaine,
        cd2.`close` AS cours_fermeture_semaine,
        v1.plus_haut_semaine,
        v1.plus_bas_semaine
    FROM v_min_max_hebdo v1
    INNER JOIN Cotations_Daily cd1
    ON v1.produit_id=cd1.produit_id
    AND v1.date_debut_semaine=cd1.`date`
    INNER JOIN Cotations_Daily cd2
    ON v1.produit_id=cd2.produit_id
    AND v1.date_fin_semaine=cd2.`date`

Discussions similaires

  1. Problème Création de vue sous TOAD
    Par littlebear dans le forum Toad
    Réponses: 3
    Dernier message: 07/01/2009, 16h51
  2. Problème création et destruction de processus.
    Par loupdeau dans le forum MFC
    Réponses: 5
    Dernier message: 08/04/2005, 13h33
  3. Création vue avec test d'existence
    Par yan77 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/12/2004, 11h44
  4. Problèmes création de procédures et de triggers
    Par missllyss dans le forum SQL
    Réponses: 2
    Dernier message: 06/11/2003, 10h42
  5. Problème création de DLL
    Par monsieur.voie.lactee dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/08/2003, 16h56

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