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 :

Ligne en colonne.


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 90
    Par défaut Ligne en colonne.
    Bonjour,

    J'ai une table TEST qui contient ces données :
    LOGON_DAY / LOGIN
    01/01/2010 08:13:15 / DUPOND
    01/01/2010 08:15:40 / DURAND
    01/01/2010 09:15:12 / DURAND
    02/01/2010 10:12:15 / MARTIN

    Actuellement j'ai écrit une requete qui me retourne ceci :

    01/01/2010 08:00 2
    01/01/2010 09:00 1
    01/01/2010 10:00 0
    02/01/2010 08:00 0
    02/01/2010 09:00 0
    02/01/2010 10:00 1


    J'aimerais arriver à faire ceci :
    08h00 / 09h00 / 10h00
    01/01/2010 / 2 / 1 / 0
    02/02/2010 / 0 / 0 / 1
    03/02/2010 / 0 / 0 / 0
    04/02/2010 / 0 / 0 / 0
    05/02/2010 / 0 / 0 / 0
    06/02/2010 / 0 / 0 / 0
    07/02/2010 / 0 / 0 / 0


    Merci.

  2. #2
    Membre expérimenté Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Par défaut
    c'est la présentation d'une matrice.

  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
    En supposant que vous n'avez pas de table calendrier, voici une solution qui utilise la fonction PIVOT (11g).
    J'ai limité à la tranche 6h / 11h pour réduire l'affichage, mais vous pouvez décommenter pour avoir toutes les heures :
    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
    WITH TT AS
    (
    select to_date('01/01/2010 08:13:15', 'dd/mm/yyyy hh24:mi:ss') dy, 'DUPOND' lg from dual union all
    select to_date('01/01/2010 08:15:40', 'dd/mm/yyyy hh24:mi:ss')   , 'DURAND'    from dual union all
    select to_date('01/01/2010 09:15:12', 'dd/mm/yyyy hh24:mi:ss')   , 'DURAND'    from dual union all
    select to_date('02/01/2010 10:12:15', 'dd/mm/yyyy hh24:mi:ss')   , 'MARTIN'    from dual
    )
      ,  HR AS
    (
    select level-1 as hrs, to_char(level-1, 'FM00') || 'h00' as hr_rep
      from dual
    connect by level <= 24
    )
      ,  CL AS
    (
    select date '2010-01-01' + level -1 as dy
      from dual
    connect by level <= 7
    )
      ,  SR1 AS
    (
      select trunc(dy) as dy,
             to_number(to_char(dy, 'hh24')) as hr,
             count(*) as nb
        from TT
    group by trunc(dy), to_number(to_char(dy, 'hh24'))
    )
      ,  SR2 AS
    (
    select CL.dy, HR.hr_rep, coalesce(SR1.nb, 0) as nb
      FROM CL
           cross join HR
           left outer join SR1
             on SR1.dy = CL.dy
            and SR1.hr = HR.hrs
    )
    select *
      from sr2
    pivot (max(nb)
           for hr_rep in (--'00h00', '01h00', '02h00', '03h00', '04h00', '05h00',
                          '06h00', '07h00', '08h00', '09h00', '10h00', '11h00'))
                          --'12h00', '13h00', '14h00', '15h00', '16h00', '17h00',
                          --'18h00', '19h00', '20h00', '21h00', '22h00', '23h00'))
    order by dy asc;
     
    DY		'06h00'	'07h00'	'08h00'	'09h00'	'10h00'	'11h00'
    01/01/2010	0	0	2	1	0	0
    02/01/2010	0	0	0	0	1	0
    03/01/2010	0	0	0	0	0	0
    04/01/2010	0	0	0	0	0	0
    05/01/2010	0	0	0	0	0	0
    06/01/2010	0	0	0	0	0	0
    07/01/2010	0	0	0	0	0	0
    Si vous n'êtes pas en 11g :
    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
    WITH TT AS
    (
    select to_date('01/01/2010 08:13:15', 'dd/mm/yyyy hh24:mi:ss') dy, 'DUPOND' lg from dual union all
    select to_date('01/01/2010 08:15:40', 'dd/mm/yyyy hh24:mi:ss')   , 'DURAND'    from dual union all
    select to_date('01/01/2010 09:15:12', 'dd/mm/yyyy hh24:mi:ss')   , 'DURAND'    from dual union all
    select to_date('02/01/2010 10:12:15', 'dd/mm/yyyy hh24:mi:ss')   , 'MARTIN'    from dual
    )
      ,  HR AS
    (
    select level-1 as hrs
      from dual
    connect by level <= 24
    )
      ,  CL AS
    (
    select date '2010-01-01' + level -1 as dy
      from dual
    connect by level <= 7
    )
      ,  SR1 AS
    (
      select trunc(dy) as dy,
             to_number(to_char(dy, 'hh24')) as hr,
             count(*) as nb
        from TT
    group by trunc(dy), to_number(to_char(dy, 'hh24'))
    )
      select CL.dy,
             max(case HR.hrs when  6 then coalesce(SR1.nb, 0) end) as "06h00",
             max(case HR.hrs when  7 then coalesce(SR1.nb, 0) end) as "07h00",
             max(case HR.hrs when  8 then coalesce(SR1.nb, 0) end) as "08h00",
             max(case HR.hrs when  9 then coalesce(SR1.nb, 0) end) as "09h00",
             max(case HR.hrs when 10 then coalesce(SR1.nb, 0) end) as "10h00",
             max(case HR.hrs when 11 then coalesce(SR1.nb, 0) end) as "11h00"
        FROM CL
             cross join HR
             left outer join SR1
               on SR1.dy = CL.dy
              and SR1.hr = HR.hrs
    GROUP BY CL.dy
    ORDER BY CL.dy ASC;
     
    DY		06h00	07h00	08h00	09h00	10h00	11h00
    01/01/2010	0	0	2	1	0	0
    02/01/2010	0	0	0	0	1	0
    03/01/2010	0	0	0	0	0	0
    04/01/2010	0	0	0	0	0	0
    05/01/2010	0	0	0	0	0	0
    06/01/2010	0	0	0	0	0	0
    07/01/2010	0	0	0	0	0	0

  4. #4
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Par défaut
    Autre solution.
    Plus couteuse que waldar mais celle ci apporte un calcul automatique des bornes sur les dates
    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
    with req as
    (
    select to_date('01/01/2010 08:13:15','DD/MM/YYYY HH24:MI:SS') as LOGON_DAY,'DUPOND' as LOGIN from dual union all
    select to_date('01/01/2010 08:15:40','DD/MM/YYYY HH24:MI:SS') as LOGON_DAY,'DURAND' as LOGIN from dual union all
    select to_date('01/01/2010 09:15:12','DD/MM/YYYY HH24:MI:SS') as LOGON_DAY,'DURAND' as LOGIN from dual union all
    select to_date('02/01/2010 10:12:15','DD/MM/YYYY HH24:MI:SS') as LOGON_DAY,'MARTIN' as LOGIN from dual
    ),
    reqminday as
    (
    select min(LOGON_DAY) as min from req
    ),
    reqday as
    (
    select min-1 + level as day from reqminday
    connect by level <=
    ((select max(LOGON_DAY) from req) - (select min(LOGON_DAY) from req)+1)
    )
    ,
    reqminheure as
    (
    select min(to_char(LOGON_DAY,'HH24')) as min from req
    ),
    reqheure as
    (
    select min-1 + level as heure from reqminheure
    connect by level <=
    ((select max(to_char(LOGON_DAY,'HH24')) from req) - (select min(to_char(LOGON_DAY,'HH24')) from req)+1)
    ),
    reqCalendrier as
    (
    select rd.day day ,rh.heure heure from reqday rd,reqheure rh
    ),
    avantPivot as (
    select day, heure ,sum(total) as total from(
    select
    day,
    heure,
    decode(to_char(LOGON_DAY,'DDMMYYYY'),to_char(rc.day,'DDMMYYYY'),decode(to_char(LOGON_DAY,'HH24'),rc.heure,1,0),0) total
    from reqCalendrier rc,req r
    )
    group by day, heure
    )
    select to_char(day,'DD/MM/YYYY') as dt,
    --sum(decode(heure,'7',total,0)) as "08h00",
    sum(decode(heure,'8',total,0)) as "08h00",
    sum(decode(heure,'9',total,0)) as "09h00",
    sum(decode(heure,'10',total,0)) as "10h00"
    --sum(decode(heure,'11',total,0)) as "10h00"
    --sum(decode(heure,'12',total,0)) as "12h00"
    from avantPivot
    group by day
    order by day

  5. #5
    Membre expérimenté Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Par défaut
    merci de marquer ce sujet comme résolu.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 90
    Par défaut
    Merci

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

Discussions similaires

  1. [T-SQL] Convertir des lignes en colonne
    Par cortex93 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/12/2005, 16h17
  2. Supprimer toutes les lignes et colonnes d'un tableau
    Par pekka77 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 01/12/2005, 11h26
  3. Tableau 5 lignes * 3 colonnes
    Par slackjayo dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 05/04/2005, 11h27
  4. Demande de conseil pour migration de lignes vers colonnes
    Par ririd dans le forum Administration
    Réponses: 6
    Dernier message: 04/11/2004, 17h02
  5. [TSynMemo] Positionnement par ligne et colonne
    Par Mercilius dans le forum Composants VCL
    Réponses: 9
    Dernier message: 16/04/2003, 16h22

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