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

MS SQL Server Discussion :

Générer les lignes manquantes


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Par défaut Générer les lignes manquantes
    Bonjour,

    voila j'ai une base de ce type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    reference | annee | mois | prix
    kxz32     | 2006  |  1   | 32
    kxz32     | 2006  |  3   | 35
    kxz32     | 2006  |  4   | 33
    tu453     | 2006  |  1   | 12
    tu453     | 2006  |  2   | 15
    tu453     | 2006  |  5   | 11
    tu453     | 2006  |  7   | 16
    En fait je voudrais qu'il me complete les mois manquants jusqu'au mois courant, avec comme valeur la derniere valeur trouvée pour la reférence.
    J'aimerais en gros obtenir une vue qui m'affiche ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    reference | annee | mois | prix
    kxz32     | 2006  |  1   | 32
    kxz32     | 2006  |  2   | 32
    kxz32     | 2006  |  3   | 35
    kxz32     | 2006  |  4   | 33
    tu453     | 2006  |  1   | 12
    tu453     | 2006  |  2   | 15
    tu453     | 2006  |  3   | 15
    tu453     | 2006  |  4   | 15
    tu453     | 2006  |  5   | 11
    tu453     | 2006  |  6   | 11
    tu453     | 2006  |  7   | 16
    Est-ce faisaible ? Si vous avez une méthode.
    J'ai regardé un peu du coté du Transact SQL (je suis en SQL SERVER 2000), notamment les CURSOR, mais je ne vois pas comment faire mon test sur ma ligne.
    Je pense que pour une ref, il faut dresser la liste des mois présents et ensuite s'il manque un mois (ou +) le(s) générer. Seulement comment faire ce test ?

    Merci de votre aide.

  2. #2
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Bonjour,

    Problème intéressant. J'y ai réfléchi un petit moment et je suis arrivé à ceci, mais il y a peut-être plus simple et je m'aveugle dans la complication. Si c'est le cas, d'autres auront mieux à proposer.

    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
     
    CREATE TABLE #tmp (reference char(5), annee int, mois int, prix smallmoney)
     
    INSERT INTO #tmp
    --reference | annee | mois | prix
    SELECT 'kxz32', 2006, 1, 32 UNION ALL
    SELECT 'kxz32', 2006, 3, 35 UNION ALL
    SELECT 'kxz32', 2006, 4, 33 UNION ALL
    SELECT 'tu453', 2006, 1, 12 UNION ALL
    SELECT 'tu453', 2006, 2, 15 UNION ALL
    SELECT 'tu453', 2006, 5, 11 UNION ALL
    SELECT 'tu453', 2006, 7, 16
    GO
     
    SELECT t2.reference, t2.annee, t2.mois --, t1.prix
    	, COALESCE(t1.prix, (SELECT ttt1.prix FROM #tmp ttt1 
    		JOIN (SELECT reference, MAX(annee + CAST(RIGHT('0'+CAST(mois as varchar(2)), 2) as int)) as MaxMois FROM #tmp GROUP BY reference) ttt2
    			ON ttt1.reference = ttt2.reference AND ttt1.annee + CAST(RIGHT('0'+CAST(ttt1.mois as varchar(2)), 2) as int) = ttt2.MaxMois
    		WHERE ttt1.reference = t2.reference))
    FROM (#tmp t1
    RIGHT JOIN (
    SELECT	tt1.reference, 
    		tt2.annee, 
    		tt2.mois
    FROM #tmp tt1
    CROSS JOIN (SELECT DISTINCT annee, mois FROM #tmp) tt2) t2 ON t1.reference = t2.reference AND t1.annee = t2.annee AND t1.mois = t2.mois )
    ORDER BY t2.reference, t2.annee, t2.mois
    GO
     
    DROP TABLE #tmp
    GO
    Une bonne solution aussi serait d'avoir une table fixe d'années et de mois pour faire un JOIN.

  3. #3
    Membre averti
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Par défaut
    Bonsoir,

    merci de ta réponse.
    J'avais pensé aussi à générer une table temporaire de toute mes années et mois.
    Mais le reste bloquait. Je vais voir ca dès lundi.

    A bientôt.

  4. #4
    Membre éprouvé
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Par défaut
    Bonjour,

    1 autre ...
    Tu vas avoir 1 lundi studieux... ;-)

    En fait le plus compliqué a été de gérer les prix manquants.
    Si tu avais pris le dernier ça aurait été plus simple.

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    1> SELECT       tmp.refer AS reference,
    2>      tmp.annee AS annee,
    3>      tmp.mois AS mois,
    4>      latable.prix
    5> FROM
    6> (
    7> SELECT       per.refer,
    8>      dat.annee,
    9>      dat.mois,
    10>     MAX(prix.mois) AS dernier
    11> FROM
    12> (
    13> SELECT      latable.refer AS refer,
    14>     latable.annee AS annee,
    15>     MIN(latable.mois) AS debut,
    16>     MAX(latable.mois) AS fin
    17> FROM        latable
    18> GROUP BY
    19>     refer,
    20>     annee
    21> ) AS per
    22> INNER JOIN
    23> (
    24> SELECT      2006 AS annee,
    25>     1 AS mois
    26> UNION
    27> SELECT      2006 AS annee,
    28>     2 AS mois
    29> UNION
    30> SELECT      2006 AS annee,
    31>     3 AS mois
    32> UNION
    33> SELECT      2006 AS annee,
    34>     4 AS mois
    35> UNION
    36> SELECT      2006 AS annee,
    37>     5 AS mois
    38> UNION
    39> SELECT      2006 AS annee,
    40>     6 AS mois
    41> UNION
    42> SELECT      2006 AS annee,
    43>     7 AS mois
    44> ) AS dat
    45> ON  dat.annee = per.annee
    46> AND dat.mois BETWEEN per.debut AND per.fin
    47> INNER JOIN latable AS prix
    48> ON  per.refer = prix.refer
    49> AND dat.annee = prix.annee
    50> AND dat.mois >= prix.mois
    51> GROUP BY
    52>     per.refer,
    53>     dat.annee,
    54>     dat.mois
    55> ) AS tmp
    56> INNER JOIN latable
    57> ON  latable.refer = tmp.refer
    58> AND latable.annee = tmp.annee
    59> AND latable.mois = tmp.dernier
    60> ORDER BY
    61>     tmp.refer,
    62>     tmp.annee,
    63>     tmp.mois
    64> go
     reference                        annee       mois        prix
     -------------------------------- ----------- ----------- --------------------
     kxz32                                   2006           1                   32
     kxz32                                   2006           2                   32
     kxz32                                   2006           3                   35
     kxz32                                   2006           4                   33
     tu453                                   2006           1                   12
     tu453                                   2006           2                   15
     tu453                                   2006           3                   15
     tu453                                   2006           4                   15
     tu453                                   2006           5                   11
     tu453                                   2006           6                   11
     tu453                                   2006           7                   16
     
    (11 rows affected)
    A +

  5. #5
    Membre averti
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Par défaut
    Bon,
    la solution de TheLeadingEdge fonctionne et j'ai réussi à modifier pour adapter à mes besoins. Seulement, encore une contrainte supplémentaire que j'éssaie d'insérer c'est si en janvier, il n'y a pas de ligne, alors on va chercher la derniere ligne qui précède.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    reference | annee | mois | prix
    kxz32     | 2005  |  11  | 32
    kxz32     | 2006  |  3   | 35
    kxz32     | 2006  |  4   | 33
    Va donner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    reference | annee | mois | prix
    kxz32     | 2005  |  11  | 32
    kxz32     | 2005  |  12  | 32
    kxz32     | 2006  |  1   | 32
    kxz32     | 2006  |  2   | 32
    kxz32     | 2006  |  3   | 35
    kxz32     | 2006  |  4   | 33
    Merci de votre aide, je vais déjeuner et reprend ce travail de longue haleine plus tard.

    EDIT : la solution de rudib ne semble pas fonctionner. J'ai reprise l'exemple mais les mois ne sont pas complétés et se retrouvent x fois.

  6. #6
    Membre averti
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Par défaut
    Personne pour cet épineux problème ?
    Merci

Discussions similaires

  1. Réponses: 9
    Dernier message: 18/03/2014, 11h51
  2. Deleter les lignes manquantes dans une Data
    Par manoir dans le forum SAS Base
    Réponses: 5
    Dernier message: 23/04/2009, 15h49
  3. [C#] Compter les lignes d'un DataSet
    Par alexischmit dans le forum ASP.NET
    Réponses: 13
    Dernier message: 26/04/2004, 15h17
  4. Réponses: 3
    Dernier message: 26/04/2004, 12h51
  5. determiner les ligne visible ds un RichEdit
    Par hhfr dans le forum Composants VCL
    Réponses: 4
    Dernier message: 19/09/2002, 18h15

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