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

Développement SQL Server Discussion :

Ajout des dates manquantes dans une requete


Sujet :

Développement SQL Server

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut Ajout des dates manquantes dans une requete
    Bonjour

    J'ai une requete donnants des evolution de prix par Produit,année,mois,Prix

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select
    Produit
    Datepart(YEAR,date) as Year,
    Datepart(MONTH,date) as Mois,
    Prix
    From PriceTable
    Mais tous les mois ne sont pas populés !
    Le resultat me donnera par exemple

    Prod1,2012,1,24
    Prod1,2012,4,28


    J'aimerais remplir les trous avec une ligne reprenant le produit et le prix du mois précédant

    Prod1,2012,1,24
    Prod1,2012,2,24
    Prod1,2012,3,24

    Prod1,2012,4,28


    Est-ce quelque chose de possible et pas trop tordu en SQL ?
    Ou vaut-il mieux directement faire cela dans un petit programme cSharp ?

    Merci de votre aide

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 852
    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 : 21 852
    Points : 52 992
    Points
    52 992
    Billets dans le blog
    6
    Par défaut
    1) SQL étant un langage complet, tout est possible
    2) vous pouvez créer une table de calendrier pour combler les trous
    3) pour reprendre une valeur précédente vous pouvez utiliser une fonction de fenêtrage comme FIRST_VALUE

    FIRST_VALUE ( colonne ) OVER ( [ partitionnement ] ordonnancement [ fenêtrage ] )

    A +

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci SqlPRO

    De fait, il faut que je cree une table calendrier !
    Je me souviens que tu avais écris un article a ce sujet je vais essayer de le retrouver

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Citation Envoyé par olibara Voir le message
    Ou vaut-il mieux directement faire cela dans un petit programme cSharp ?
    Si je le pouvais, personnellement, je ferais ça !

  5. #5
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci Aieeeuuu

    Oui je pense que je serai plus a l'aise en cSharp car je maitrise mal le partitionnement et le fenetrage suggeré par sqlpro

    Au passage ca m'a quand meme permis de trouver un bout de code fort utile pour creer un calendrier que voici

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    drop table calendar;
    declare @start_dt as date = '20110101';    
    declare @end_dt as date = '20150101';      
     
    declare @dates as table (
     date_id date primary key,
     date_year smallint,
     date_month tinyint,
     date_day tinyint,
     weekday_id tinyint,
     weekday_nm varchar(10),
     month_nm varchar(10),
     day_of_year smallint,
     quarter_id tinyint,
     first_day_of_month date,
     last_day_of_month date,
     start_dts datetime,
     end_dts datetime
    )
     
    while @start_dt < @end_dt
    begin
        insert into @dates(
            date_id, date_year, date_month, date_day, 
            weekday_id, weekday_nm, month_nm, day_of_year, quarter_id, 
            first_day_of_month, last_day_of_month, 
            start_dts, end_dts
        )   
        values(
            @start_dt, year(@start_dt), month(@start_dt), day(@start_dt), 
            datepart(weekday, @start_dt), datename(weekday, @start_dt), datename(month, @start_dt), datepart(dayofyear, @start_dt), datepart(quarter, @start_dt),
            dateadd(day,-(day(@start_dt)-1),@start_dt), 
            dateadd(day,-(day(dateadd(month,1,@start_dt))),dateadd(month,1,@start_dt)), 
            cast(@start_dt as datetime), 
            dateadd(second,-1,cast(dateadd(day, 1, @start_dt) as datetime))
        )
        set @start_dt = dateadd(day, 1, @start_dt)
    end
     
    select  *
     into Calendar
     from @dates d
     order by  
     date_year,
     date_month,
     date_day,
     date_id

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajout d'un champ dans une requete
    Par maysa dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/04/2007, 11h35
  2. Ajouter des nouvelles données dans une table
    Par Lingo dans le forum Access
    Réponses: 7
    Dernier message: 27/10/2006, 13h58
  3. [SQL] Ajout d'un compteur dans une requete
    Par at_first dans le forum Access
    Réponses: 7
    Dernier message: 04/10/2006, 16h40
  4. ajouter des dates délémitées dans INSERT INTO ?
    Par samlepiratepaddy dans le forum Access
    Réponses: 8
    Dernier message: 27/09/2005, 08h12
  5. Date nulle dans une requete paramétrée avec TParameter
    Par denrette dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/06/2004, 08h37

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