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 :

SQL : Startdates et Enddates


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 24
    Par défaut SQL : Startdates et Enddates
    Bonjour,

    Je suis en train de développer un reporting sur un système opérationnel et je me trouve actuellement devant un petit problème.

    Dans l'application, j'ai une table de prix qui est censée être historisée... quand il y a changement de prix, il doit y avoir une Startdate et une Enddate pour l'ancien prix. Puis une nouvelle ligne avec le nouveau prix, la startdate du nouveau prix (qui doit être égale à la enddate de l'ancien) et une nouvelle enddate (1/1/9999 serait l'idéal).

    Le problème que j'ai, c'est que les enddates ne sont pas remplies quand il y a un nouveau prix (les startdates bien). Ca n'a pas été géré automatiquement dans l'application (ça devrait être corrigé).

    Ce que j'aimerais entre temps, c'est créer une vue sur base de cette table de prix avec les valeurs correctes pour les enddates.

    Donc la règle est simple, si j'ai ça dans ma table :

    prix - startdate - enddate
    650 - 1/7/2006 - NULL
    675 - 1/4/2007 - NULL
    700 - 1/9/2007 - NULL

    je dois avoir dans ma vue

    prix - startdate - enddate
    650 - 1/7/2006 - 1/4/2007
    675 - 1/4/2007 - 1/9/2007
    700 - 1/9/2007 - 1/1/9999

    la enddate du record actuel = startdate du record suivant; si pas de record suivant : 1/1/9999

    Comment est-ce que je peux traduire ça en SQL pour remplir ma vue sans devoir passer par un patch avec des curseurs?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Bonjour,

    Quel SGBD, quelle version ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 24
    Par défaut
    C'est en MySQL 5 que je développe ça.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Dans l'application, j'ai une table de prix qui est censée être historisée... quand il y a changement de prix, il doit y avoir une Startdate et une Enddate pour l'ancien prix. Puis une nouvelle ligne avec le nouveau prix, la startdate du nouveau prix (qui doit être égale à la enddate de l'ancien) et une nouvelle enddate (1/1/9999 serait l'idéal).
    Votre modèle de données n'est pas bon. En effet il y a redondance dans le fait que la endate de la période précédente est la startdate (+- delta suivant l'inclusion de la borme) de la période suivante.
    Vous ne devez donc pas avoir de colonne EndDate dans votre table, puisque cette colonne peut être calculée.
    Au final votre table et votre vue doit ressembler à ceci :

    La table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE T_PRIX 
    (Clef       INT NOT NULL, 
     StartDate  DATETIME NOT NULL, 
     Prix       DECIMAL(16,2),
     CONSTRAINT PK_PRX PRIMARY KEY (Clef, StartDate))
    Des données de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO T_PRIX VALUES (1, '1/7/2006', 650)
    INSERT INTO T_PRIX VALUES (1, '1/4/2007', 675)
    INSERT INTO T_PRIX VALUES (1, '1/9/2007', 700)
    INSERT INTO T_PRIX VALUES (2, '1/6/2006', 1650)
    INSERT INTO T_PRIX VALUES (2, '1/2/2008', 1975)
    La vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE VIEW V_PRIX
    AS
    SELECT Clef, StartDate, 
           COALESCE((SELECT MIN(P2.StartDate) - 1 DAY 
                     FROM   T_PRIX AS P2
                     WHERE  P2.Clef = P1.Clef
                       AND  P2.StartDate > P1.StartDate), 
                   '31/12/9999') AS EndDate, 
           Prix
    FROM   T_PRIX AS P1
    Test :
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Clef        StartDate       EndDate         Prix
    ----------- --------------- --------------- -------------
    1           2006-07-01      2007-03-31      650.00
    1           2007-04-01      2007-08-31      675.00
    1           2007-09-01      9999-12-31      700.00
    2           2006-06-01      2008-01-31      1650.00
    2           2008-02-01      9999-12-31      1975.00
    Bref, apprenez SQL, mon site web, comme mes bouquins, peuvent vous y aider !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 24
    Par défaut
    Merci pour votre intervention.
    Effectivement, le modèle de données sur lequel nous travaillons a été développé par une autre équipe que la nôtre (celle qui a mis l'application web sur pied) et vu que la enddate 'peut' être insérée à l'avance (on peut définir que dans 3 mois, le prix ne sera plus d'application), le champ enddate dans cette table était obligatoire.
    La vue que nous créons permet de remplacer les 'null' (pas de contrainte sur les enddates, ça devrait être géré à la prochaine version de l'application) et de pouvoir enfin faire les calculs qui nous intéressent pour le reporting.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par Lemuel Voir le message
    La vue que nous créons permet de remplacer les 'null' (pas de contrainte sur les enddates, ça devrait être géré à la prochaine version de l'application) et de pouvoir enfin faire les calculs qui nous intéressent pour le reporting.
    Vous faites votre reporting directement sur la base applicative de production ?

Discussions similaires

  1. [1.x] Validator StartDate EndDate Symfony
    Par Fab6363 dans le forum Symfony
    Réponses: 7
    Dernier message: 11/10/2011, 10h02
  2. L'avenir du BDE et des SQL Links révélé ! <officiel>
    Par Merlin dans le forum Bases de données
    Réponses: 12
    Dernier message: 02/06/2006, 10h18
  3. Pb migration Access / SQL server
    Par yoyo dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 25/04/2005, 10h39
  4. Cours, tutoriels, logiciels, F.A.Q,... pour le langage SQL
    Par Marc Lussac dans le forum Langage SQL
    Réponses: 0
    Dernier message: 04/04/2002, 10h21

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