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

SQL Oracle Discussion :

TSQL Challenge 18


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 TSQL Challenge 18
    Le challenge officiel est à relever sur SQL Server.

    Ce challenge-ci est purement cosmétique, et j'ai pris du plaisir à résoudre les problèmes un par un au fur et à mesure qu'ils étaient rencontrés.
    J'invite les amoureux de la cosmétique à le faire sur leur SGBD préféré !
    Bien entendu, ce genre de chose n'iront jamais en prod, mais celà permet de rôder les techniques vues ici et là.

    Pas la peine d'envoyer votre solution sur le site officiel, ils ne testent que les solutions T-SQL bien entendu.

    Le sujet-relai sur développez :
    http://www.developpez.net/forums/d84...hallenge-18-a/

    Le challenge inital :
    http://beyondrelational.com/blogs/tc...calendars.aspx

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

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Génial, Waldar, on va pouvoir rigoler !

    Au passage, j'ai l'impression que ton compteur d'années à basculé récemment, donc : joyeux anniversaire

    (c'est sûrement l'approche du week-end qui me met de si bonne humeur )

  3. #3
    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
    Il faut avoir des yeux bioniques pour remarquer les changements d'années sur un attribut de profil d'un forum quand même !

    Mais félicitations, c'était il y a deux jours.
    Je ne serai probablement pas capable de la réciproque

    J'ai oublié, le jeu de données inital avec Oracle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    with t as
    (
    select  8 as mth, 2009 as yr from dual union all
    select  2       , 1900       from dual union all
    select 10       , 1959       from dual
    )
    select * from t;
     
    MTH	YR
    ------- -------
    8	2009
    2	1900
    10	1959
    La sortie attendue (ici en anglais, mais la langue ne doit pas influer si les mises en pages ou sur les ordres), une simple colonne de 31 caractères :
    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
    +-----------------------------+
    |        FEBRUARY 1900        |
    |=============================|
    | Sun Mon Tue Wed Thu Fri Sat |
    |-----------------------------|
    |                  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              |
    +-----------------------------+
    +-----------------------------+
    |        OCTOBER 1959         |
    |=============================|
    | Sun Mon Tue Wed Thu Fri Sat |
    |-----------------------------|
    |                  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  |
    +-----------------------------+
    +-----------------------------+
    |         AUGUST 2009         |
    |=============================|
    | Sun Mon Tue Wed Thu Fri Sat |
    |-----------------------------|
    |                          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                      |
    +-----------------------------+

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Salut Waldar,

    Excellent challenge, ça m'a beaucoup plus
    Je ne sais pas s'il est bien de poster la solution tout de suite, dans le doute j'attends, donc voici un avant goût
    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    SQL> @challenge_nls.sql
     
    PARAMETER                 VALUE
    ------------------------- ------------------------------
    NLS_LANGUAGE              AMERICAN                      
    NLS_TERRITORY             AMERICA                       
    NLS_CURRENCY              $                             
    NLS_ISO_CURRENCY          AMERICA                       
    NLS_NUMERIC_CHARACTERS    .,                            
    NLS_CALENDAR              GREGORIAN                     
    NLS_DATE_FORMAT           DD-MON-RR                     
    NLS_DATE_LANGUAGE         AMERICAN                      
    NLS_SORT                  BINARY                        
    NLS_TIME_FORMAT           HH.MI.SSXFF AM                
    NLS_TIMESTAMP_FORMAT      DD-MON-RR HH.MI.SSXFF AM      
    NLS_TIME_TZ_FORMAT        HH.MI.SSXFF AM TZR            
    NLS_TIMESTAMP_TZ_FORMAT   DD-MON-RR HH.MI.SSXFF AM TZR  
    NLS_DUAL_CURRENCY         $                             
    NLS_COMP                  BINARY                        
    NLS_LENGTH_SEMANTICS      BYTE                          
    NLS_NCHAR_CONV_EXCP       FALSE                         
     
    17 rows selected.
     
     
    CALENDRIER
    --------------------------------
    +-----------------------------+ 
    |        FEBRUARY 1900        | 
    |=============================| 
    | SUN MON TUE WED THU FRI SAT | 
    |-----------------------------| 
    |                  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              | 
    +-----------------------------+ 
     
    +-----------------------------+
    |         OCTOBER 1959        |
    |=============================|
    | SUN MON TUE WED THU FRI SAT |
    |-----------------------------|
    |                  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  |
    +-----------------------------+
     
    +-----------------------------+
    |         AUGUST 2009         |
    |=============================|
    | SUN MON TUE WED THU FRI SAT |
    |-----------------------------|
    |                          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                      |
    +-----------------------------+
     
     
    37 rows selected.
     
     
    Session altered.
     
     
    PARAMETER                 VALUE
    ------------------------- ------------------------------
    NLS_LANGUAGE              AMERICAN                      
    NLS_TERRITORY             FRANCE                        
     
     
    CALENDRIER
    --------------------------------
    +-----------------------------+ 
    |        FEBRUARY 1900        | 
    |=============================| 
    | SUN MON TUE WED THU FRI SAT | 
    |-----------------------------| 
    |                  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              | 
    +-----------------------------+ 
     
    +-----------------------------+
    |         OCTOBER 1959        |
    |=============================|
    | SUN MON TUE WED THU FRI SAT |
    |-----------------------------|
    |                  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  |
    +-----------------------------+
     
    +-----------------------------+
    |         AUGUST 2009         |
    |=============================|
    | SUN MON TUE WED THU FRI SAT |
    |-----------------------------|
    |                          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                      |
    +-----------------------------+
     
     
    37 rows selected.
     
     
    Session altered.
     
     
    PARAMETER                 VALUE
    ------------------------- ------------------------------
    NLS_LANGUAGE              FRENCH
    NLS_TERRITORY             FRANCE
     
     
    CALENDRIER
    --------------------------------
    +-----------------------------+
    |         FEVRIER 1900        |
    |=============================|
    | DIM LUN MAR MER JEU VEN SAM |
    |-----------------------------|
    |                  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              |
    +-----------------------------+
     
    +-----------------------------+
    |         OCTOBRE 1959        |
    |=============================|
    | DIM LUN MAR MER JEU VEN SAM |
    |-----------------------------|
    |                  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  |
    +-----------------------------+
     
    +-----------------------------+
    |          AOUT 2009          |
    |=============================|
    | DIM LUN MAR MER JEU VEN SAM |
    |-----------------------------|
    |                          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                      |
    +-----------------------------+
     
     
    37 rows selected.
    Donc j'ai suivi les règles du Submission Guildelines :
    Make sure that your solution uses a SET based approach to solve the problem.
    Même si je pense qu'une fonction pipelined est plus appropriée (existe t'il l'équivalent sur SqlServer ?)
    Et celle du challenge :
    The output must be unchanged regardless of the SET DATEFIRST setting
    Il n'y a pas d'équivalent direct sur Oracle, mais j'ai forcée le dimanche en premier (modifications du nls_territory impactant le to_char(sysdate,'D')), et ça m'a bien arrangé , j'espère ne pas avoir mal interprété...

    Il me reste encore un petit bug visible , je suis obligé de cast mon résultat final en varchar2(32) pour que tous les | finaux apparaissent.
    Car en varchar2(31), ceux des lignes "FEBRUARY 1900" et "AUGUST 2009" ne s'affichent pas même si leur length est de 31...mais bon je ne soumets pas officiellement, alors...ça passe !

    PS1 : Je n'ai pas utilisé la clause MODEL mais je pense qu'elle peut aussi aider niveau cosmétique, avis aux amateurs
    PS2 : Pacman, du cosmétique pur et dur, on attend ta proposition
    PS3 : Evidemment Waldar je suis très intéressé par la tienne, y compris ta solution SqlServer

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

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Ouais Skuatamad !

    Je me suis pas autant appliqué que toi... je pense que je n'ai même pas suivi toutes les règles (notamment pour les entêtes de jours).

    Mais je poste ma version de la requête ignoble :

    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
     
    with t as (     
    select 8 as m, 2008 as y from dual     
    union all select 4 as m, 2001 as y from dual     
    union all select 12 as m, 2009 as y from dual     
    ), 
    u as(
    select to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd') as fday
    , last_day(to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd')) as lday
    , to_number(to_char(last_day(to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd')), 'dd')) as ndays 
    , m, y
    --, case to_number(to_char(to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd'), 'D')) when 7 then 0 else  
    --to_number(to_char(to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd'), 'D')) end as wday
    , to_number(to_char(to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd'), 'D')) - 1as wday
    from t)
    , tt as (
    select rownum as d from dba_objects
    where rownum <= 31)
    , v as (
    select d, mod(wday + d, 7) as col, trunc((wday + d - 1)/ 7) as grp, m, y
    from u join tt on d <= ndays 
    ) 
    , w as (
    select y, m, grp, count(*) as jrs
    , case grp when 0 then lpad(' ',(7 - count(*)) * 4) end || 
    rtrim(RTRIM(REPLACE(REPLACE(XMLAgg(XMLElement("x", case when d <= 9 then ' ' end || to_char(d) ) order by d) , '<x>', ' '), '</x>', ' '), ',')) as ligne
    from v
    group by y, m, grp
    order by y, m, grp)
    ,x as (
    select y,m, -5 as grp, '+----------------------------+' as ligne from t union all
    select y,m, -4 as grp, 
    '|' || lpad(' ', trunc((28 - length(trim(to_char(to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd'), 'MONTH'))) - 1 - length(to_char(y)))/2)) 
    || trim(to_char(to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd'), 'MONTH')) || ' ' || to_char(y)
    || lpad(' ',  trunc((28 - length(trim(to_char(to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd'), 'MONTH'))) - 1 - length(to_char(y)))/2)
    + mod(28 - length(trim(to_char(to_date(to_char(y*10000 + m * 100 + 1), 'yyyymmdd'), 'MONTH'))) - 1 - length(to_char(y)), 2)) || '|' from t union all
    select y,m, -3 as grp, '+----------------------------+' as ligne from t union all
    select y,m, -1 as grp, '+----------------------------+' as ligne from t union all
    select y,m, 10 as grp, '+----------------------------+' as ligne from t union all
    select y, m, -2 as grp, '| Su  Mo  Tu  We  Th  Fr  Sa |' as ligne
    from t)
    , y as (
    select 0, grp,y,m, ligne
    from x 
    union all 
    select length(ligne), grp,y,m, '|' || ligne || lpad(' ', 28 - length(ligne)) || '|' as l 
    from w
    )
    select ligne
    from y
    order by y,m, grp;
    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
     
    LIGNE
    ------------------------------------
    +----------------------------+
    |         APRIL 2001         |
    +----------------------------+
    | Su  Mo  Tu  We  Th  Fr  Sa |
    +----------------------------+
    |  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                     |
    +----------------------------+
    +----------------------------+
    |        AUGUST 2008         |
    +----------------------------+
    | Su  Mo  Tu  We  Th  Fr  Sa |
    +----------------------------+
    |                      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                         |
    +----------------------------+
    +----------------------------+
    |       DECEMBER 2009        |
    +----------------------------+
    | Su  Mo  Tu  We  Th  Fr  Sa |
    +----------------------------+
    |          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         |
    +----------------------------+
     
    34 rows selected.
    Je suis un peu frustré parce que je ne me suis pas pris le temps de faire sans les fonctions de dates... mais ce n'est que partie remise

    [EDIT]
    Euh, en regardant mon résultat, j'ai l'impression que je me suis vautré quelque part
    [EDIT2]
    Juste un problème de nls, vu que j'ai développé sous SQL Developper... c'est réglé

  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
    Il doit y avoir un petit décalage dans les jours, si je prends février 1900, c'est un jeudi et la requête renvoie un mercredi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    +----------------------------+
    |        FÉVRIER 1900        |
    +----------------------------+
    | Su  Mo  Tu  We  Th  Fr  Sa |
    +----------------------------+
    |              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                 |
    +----------------------------+
    Les effets visuels du calendrier ne sont pas tout à fait ceux demandé, mais ça ne devrait pas être trop compliqué à modifier.

    Et les noms des jours sont écrits en dur !

    Le reste ressemble un peu à ce que j'ai écrit, sauf sur la présentation des jours dans le calendrier.

    Par contre la mise en page de la requête, zéro pointé !

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Je suis un peu frustré parce que je ne me suis pas pris le temps de faire sans les fonctions de dates... mais ce n'est que partie remise
    Loin de moi l'idée de de te mettre à ce point la pression
    T'avais le temps, j'attirais juste ton attention sur ce challenge super cool collant bien avec tes délires SQLesques

    Par contre, vous êtes tous les 2 parti sur une base plus saine que moi...
    Moi, je me trimbale une grosse table calendar

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

Discussions similaires

  1. TSQL Challenge 9
    Par agemis31 dans le forum Développement
    Réponses: 12
    Dernier message: 21/09/2009, 11h57
  2. TSQL Challenges: appel à contribution
    Par agemis31 dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 19/06/2009, 22h32
  3. Annonce: TSQL Challenges
    Par agemis31 dans le forum Développement
    Réponses: 25
    Dernier message: 14/06/2009, 19h50
  4. TSQL Challenge 8
    Par agemis31 dans le forum Développement
    Réponses: 8
    Dernier message: 27/05/2009, 20h32
  5. TSQL Challenge 7
    Par agemis31 dans le forum Développement
    Réponses: 10
    Dernier message: 24/05/2009, 21h55

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