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 :

Requête SQL pivot ?


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 5
    Points : 7
    Points
    7
    Par défaut Requête SQL pivot ?
    Bonjour,

    J'ai voulu essayé de faire une fonction pivot mais sans succés pourriez-vous me dire si la fonction pivot est bien celle qui faut que j'utilise pour faire ce dont je souhaite :

    j'ai une table suivante :

    Mat Nom    Type Hours Date
    --- ------ ---- ----- ----------
    001 jerome eff  7     03/12/2012
    001 jerome th   8     03/12/2012
    002 andree eff  6     03/12/2012
    002 andree th   8     03/12/2012
    001 jerome eff  8     04/12/2012
    002 andree eff  8     04/12/2012
    Je voudrais faire une requête select en SQL qui me retourne :
    Mat Nom    eff th   Date
    --- ------ --- ---- ----------
    001 jerome 7   8    03/12/2012
    002 andree 6   8    03/12/2012
    001 jerome 8   NULL 04/12/2012
    002 andree 8   NULL 04/12/2012
    D'avance merci pour votre aide.

    PS : La base de donnée est un serveur SQL 2012

    Merci,

    Jérôme

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Je vous confirme, c'est bien la fonctionnalité PIVOT dont vous avez besoin.

  3. #3
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    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
    with test as
    (       
    select '001'Mat, 'jerome' Nom, 'eff' Type, 7 Hours,    to_date('03/12/2012') jour from dual union 
    select '001', 'jerome', 'th',   8    , to_date('03/12/2012') from dual union 
    select '002', 'andree', 'eff',  6    , to_date('03/12/2012')from dual union 
    select '002', 'andree', 'th',   8    , to_date('03/12/2012')from dual union 
    select '001', 'jerome', 'eff',  8    , to_date('04/12/2012')from dual union 
    select '002', 'andree', 'eff',  8    , to_date('04/12/2012')from dual )
     
     
    select nvl(A.mat,B.mat) mat,nvl(A.nom,B.nom) nom,A.eff,B.th,nvl(A.jour,B.jour)jour from
     
      (select mat,nom,jour,hours eff
       from test
       where type='eff')A 
     
    full   join
     
      (select mat,nom,jour,hours th
       from test
       where type='th')B 
     
    on A.mat=B.mat and A.jour=B.jour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       	MAT	NOM	EFF	TH	JOUR
    1	001	jerome	7	8	03/12/2012
    2	002	andree	6	8	03/12/2012
    3	002	andree	8		04/12/2012
    4	001	jerome	8		04/12/2012

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    Merci Islamov2000,

    Ton code m'as beaucoup aidé je dirais meme plus ça fonctionne avec ma table de production ^^

    J'ai seulement utilisé COALESCE à la place de mvl car c'est sur un serveur SQL 2012.

    Je te remercie encore de ton aide précieuse

    @bientot car je doit integrer une deuxieme table pour avoir un peu plus de données si vraiment je n'y arrive pas je reviendrais demander de l'aide

    Jérôme

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    Bon finalement je séche encore ...

    Voila l'exposé :

    2 tables : ABSENCE , TOTAL

    pour la table TOTAL :
    Mat Nom    Type Hours Date
    --- ------ ---- ----- ----------
    001 jerome eff  7     03/12/2012
    001 jerome th   8     03/12/2012
    002 andree eff  6     03/12/2012
    002 andree th   8     03/12/2012
    001 jerome eff  8     04/12/2012
    002 andree eff  8     04/12/2012
    002 andree th   8     05/12/2012
    Pour la table ABSENCE :

    Mat Nom    Type2 Hours Date
    --- ------ ---- ----- ----------
    001 jerome cp   7     04/12/2012
    002 andree rtt  6     05/12/2012
    


    Il me faudrait enfaite combiner les 2 tables pour avoir ceci comme résultat
    Mat Nom    eff  th    cp   rtt  Date
    --- ------ ---- ----  ---- ---- ----------
    001 jerome 7    8     NULL NULL 03/12/2012
    002 andree 6    8     NULL NULL 03/12/2012
    001 jerome 8    NULL  7    NULL 04/12/2012
    002 andree 8    NULL  NULL NULL 04/12/2012
    002 andree NULL 8     NULL 6    05/12/2012
    Les champs des 2 tables sont identique sauf pour le "Type" .

    D'avance merci pour votre soutient

    Jerôme

  6. #6
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    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 total as
    (       
    select '001'Mat  , 'jerome' Nom, 'eff' Type   , 7 Hours, to_date('03/12/2012') jour from dual union 
    select '001'     , 'jerome'    , 'th'         , 8      , to_date('03/12/2012') from dual union 
    select '002'     , 'andree'    , 'eff'        , 6      , to_date('03/12/2012')from dual union 
    select '002'     , 'andree'    , 'th'         , 8      , to_date('03/12/2012')from dual union 
    select '001'     , 'jerome'    , 'eff'        , 8      , to_date('04/12/2012')from dual union 
    select '002'     , 'andree'    , 'eff'        , 8      , to_date('04/12/2012')from dual union
    select '002'     , 'andree'    , 'th'         , 8      , to_date('05/12/2012')from dual),
    absence as
    (select '001' mat , 'jerome' nom , 'cp' type2 ,  7 hours, to_date('04/12/2012') jour from dual union
    select '002' mat , 'andree' nom , 'rtt' type2 ,  6 hours, to_date('05/12/2012') jour from dual
     
    )
     
     
     
    select C.mat,C.nom,C.eff,C.th,F.cp,F.rtt,C.jour from 
    ---------------------------------------------------------------------------------------------
    (select nvl(A.mat,B.mat) mat,nvl(A.nom,B.nom) nom,A.eff,B.th,nvl(A.jour,B.jour)jour from
        (select mat,nom,jour,hours eff
         from total
         where type='eff')A --A
     
        full join
     
        (select mat,nom,jour,hours th
         from total
         where type='th')B --B
     
        on A.mat=B.mat and A.jour=B.jour) C--C
    ----------------------------------------------------------------------------------------------
    ---------
    full join
    -------- 
    ---------------------------------------------------------------------------------------------
    (select nvl(D.mat,E.mat) mat,nvl(D.nom,E.nom) nom,D.cp,E.rtt,nvl(D.jour,E.jour)jour from
     
        (select mat,nom,jour,hours cp
         from absence
         where type2='cp')D --D
     
        full join
     
        (select mat,nom,jour,hours rtt
         from absence
         where type2='rtt')E--E
     
        on D.mat=E.mat and D.jour=E.jour) F --F
    ----------------------------------------------------------------------------------------------
    on C.mat=F.mat and C.jour=F.jour
     
    order by C.jour,C.mat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       	MAT	NOM	EFF	TH	CP	RTT	JOUR
    1	001	jerome	7	8			03/12/2012
    2	002	andree	6	8			03/12/2012
    3	001	jerome	8		7		04/12/2012
    4	002	andree	8				04/12/2012
    5	002	andree		8		6	05/12/2012

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 394
    Points
    18 394
    Par défaut
    L'opérateur PIVOT reste plus rapide à utiliser ici quand même :
    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
    WITH total (Mat, Nom, [Type], [Hours], [Date]) AS
    (       
    SELECT '001', 'jerome', 'eff', 7, '03/12/2012' union all
    SELECT '001', 'jerome', 'th' , 8, '03/12/2012' union all
    SELECT '002', 'andree', 'eff', 6, '03/12/2012' union all
    SELECT '002', 'andree', 'th' , 8, '03/12/2012' union all
    SELECT '001', 'jerome', 'eff', 8, '04/12/2012' union all
    SELECT '002', 'andree', 'eff', 8, '04/12/2012' union all
    SELECT '002', 'andree', 'th' , 8, '05/12/2012'
    )
      ,  absence (Mat, Nom, [Type2], [Hours], [Date]) AS
    (
    SELECT '001', 'jerome', 'cp' , 7, '04/12/2012' union all
    SELECT '002', 'andree', 'rtt', 6, '05/12/2012'
    )
      ,  totabs (Mat, Nom, [Type], [Hours], [Date]) as
    (
    select Mat, Nom, [Type] , [Hours], [Date] from total
     union all
    select Mat, Nom, [Type2], [Hours], [Date] from absence
    )
      select Mat, Nom, [eff], [th], [cp], [rtt], [Date]
        from totabs
       pivot (max([Hours]) for [Type] in ([eff], [th], [cp], [rtt])) as pvt
    order by [Date] asc, Mat asc;
     
    Mat  Nom    eff         th          cp          rtt         Date
    ---- ------ ----------- ----------- ----------- ----------- ----------
    001  jerome 7           8           NULL        NULL        03/12/2012
    002  andree 6           8           NULL        NULL        03/12/2012
    001  jerome 8           NULL        7           NULL        04/12/2012
    002  andree 8           NULL        NULL        NULL        04/12/2012
    002  andree NULL        8           NULL        6           05/12/2012

  8. #8
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    @Waldar:
    Est ce que PIVOT et UNPIVOT sont des fonctions de SQL standard.
    En Oracle, ces fonctions ne sont supportées qu'à la version 11g.

  9. #9
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Et je propose une autre solution plus simple en SQL standard.
    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
     
    WITH total AS
    (       
    SELECT '001'Mat  , 'jerome' Nom, 'eff' Type   , 7 Hours, to_date('03/12/2012') jour FROM dual union 
    SELECT '001'     , 'jerome'    , 'th'         , 8      , to_date('03/12/2012') FROM dual union 
    SELECT '002'     , 'andree'    , 'eff'        , 6      , to_date('03/12/2012')FROM dual union 
    SELECT '002'     , 'andree'    , 'th'         , 8      , to_date('03/12/2012')FROM dual union 
    SELECT '001'     , 'jerome'    , 'eff'        , 8      , to_date('04/12/2012')FROM dual union 
    SELECT '002'     , 'andree'    , 'eff'        , 8      , to_date('04/12/2012')FROM dual union
    SELECT '002'     , 'andree'    , 'th'         , 8      , to_date('05/12/2012')FROM dual),
    absence AS
    (SELECT '001' mat , 'jerome' nom , 'cp' type2 ,  7 hours, to_date('04/12/2012') jour FROM dual union
    SELECT '002' mat , 'andree' nom , 'rtt' type2 ,  6 hours, to_date('05/12/2012') jour FROM dual
     
    ),
    l_union as
    (select * from total
    union
    select * from absence
     )
     
    SELECT mat,nom,
           SUM(CASE WHEN type = 'eff' THEN hours  END) eff,
           SUM(CASE WHEN type = 'th' THEN hours  END) th,
           SUM(CASE WHEN type = 'cp' THEN hours  END) cp,
           SUM(CASE WHEN type = 'rtt' THEN hours  END) rtt,
           jour
     
     
    from l_union
    group by mat,jour,nom
    order by jour,mat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       	MAT	NOM	EFF	TH	CP	RTT	JOUR
    1	001	jerome	7	8			03/12/2012
    2	002	andree	6	8			03/12/2012
    3	001	jerome	8		7		04/12/2012
    4	002	andree	8				04/12/2012
    5	002	andree		8		6	05/12/2012

  10. #10
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Est ce que PIVOT et UNPIVOT sont des fonctions de SQL standard
    PIVOT est apparu sous SQL server 2005 et ne fait pas partis de la norme SQL, sauf erreur de ma part. @Waldar confirmera

    Cordialement,

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 394
    Points
    18 394
    Par défaut
    À ma connaissance c'est une fonctionnalité hors-norme, mais c'est plutôt SQLPro qui pourra confirmer si ça a évolué depuis son article sur les nouveautés de SQL-Server 2005 :
    Citation Envoyé par SQLPro
    L'horrible, mais traditionnel opérateur PIVOT, bien qu'absent de la norme SQL fait son apparition dans SQL Server 2005 afin de permettre de réaliser des tableaux croisés. Il s'agit simplement d'une astuce cosmétique pour présenter des données avec de nouvelles colonnes dont les noms sont extraits d'une des colonnes de la requête.
    Mais comme c'est un besoin récurrent (il n'y a qu'a voir le nombre de demande sur ce forum), après son implémentation dans SQL-Server 2005 ça a été repompé par Oracle Database en version 11gR1.

    On peut effectivement s'en passer avec la dernière méthode proposée par islamov2000, le seul avantage de la fonction PIVOT est qu'il est syntaxiquement plus rapide à écrire.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    Bonjour et merci pour toute vos réponse.

    @Waldar :

    J'ai testé la fonction pivot mais sans succés dans l'exemple vous avez créé une table "totabs" mais je doit pas passer par une table temporaire je peut seulement interoger la base je n'arrive donc pas à la faire fonctionner. c'est surement du a mon manque de connaisance en SQL :\

    @Islamov2000 :

    J'ai voulu tester votre solution plus simple en SQL , mais idem sans succé car j'ai une erreur sur le AS pour attribuer un nom a l'union ...

    Pour info j'avais plus de type dans la table absence j'ai donc du modifier un peu le code mais je ne sais pas si c'est propre mais cela fonctionne :


    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
    SELECT C.matri,SUBSTRING (convert(varchar,C.dat,103),7,4) + SUBSTRING (convert(varchar,C.dat,103),4,2) + SUBSTRING (convert(varchar,C.dat,103),1,2)  dat,C.hjtheo,C.hjpoin,F.hjcong,F.hjrtt,I.hjmalad,I.hjcredhe,COALESCE(L.hjabsaut,L.hjabsaut2)hjabsaut FROM 
     
    (SELECT COALESCE(A.EMPLOYEE_IDENTIFICATION_NUMBER,B.EMPLOYEE_IDENTIFICATION_NUMBER) matri,COALESCE(A.EMPLOYEE_SURNAME,B.EMPLOYEE_SURNAME) nom,A.hjpoin,B.hjtheo,COALESCE(A.TOTAL_DATE,B.TOTAL_DATE)dat FROM
        (SELECT EMPLOYEE_IDENTIFICATION_NUMBER,EMPLOYEE_SURNAME,TOTAL_DATE,HOURS hjpoin
         FROM ESTIMATED_DAILY_TOTAL
         WHERE TYPE_ABBREVIATION='eff')A
     
        full JOIN
     
        (SELECT EMPLOYEE_IDENTIFICATION_NUMBER,EMPLOYEE_SURNAME,TOTAL_DATE,HOURS hjtheo
         FROM ESTIMATED_DAILY_TOTAL
         WHERE TYPE_ABBREVIATION='th')B
     
        ON A.EMPLOYEE_IDENTIFICATION_NUMBER=B.EMPLOYEE_IDENTIFICATION_NUMBER AND A.TOTAL_DATE=B.TOTAL_DATE) C
     
     
    full JOIN
     
    (SELECT COALESCE(D.EMPLOYEE_IDENTIFICATION_NUMBER,E.EMPLOYEE_IDENTIFICATION_NUMBER) matri,COALESCE(D.EMPLOYEE_SURNAME,E.EMPLOYEE_SURNAME) nom,D.hjcong,E.hjrtt,COALESCE(D.TOTAL_DATE,E.TOTAL_DATE)dat FROM
     
        (SELECT EMPLOYEE_IDENTIFICATION_NUMBER,EMPLOYEE_SURNAME,TOTAL_DATE,HOURS hjcong
         FROM ESTIMATED_DAILY_ABSENCE
         WHERE ABS_TYPE_ABBREVIATION='CP')D 
     
        full JOIN
     
        (SELECT EMPLOYEE_IDENTIFICATION_NUMBER,EMPLOYEE_SURNAME,TOTAL_DATE,HOURS hjrtt
         FROM ESTIMATED_DAILY_ABSENCE
         WHERE ABS_TYPE_ABBREVIATION='RTT')E
     
        ON D.EMPLOYEE_IDENTIFICATION_NUMBER=E.EMPLOYEE_IDENTIFICATION_NUMBER AND D.TOTAL_DATE=E.TOTAL_DATE) F 
     
    ON C.matri=F.matri AND C.dat=F.dat
     
    full JOIN
     
    (SELECT COALESCE(G.EMPLOYEE_IDENTIFICATION_NUMBER,H.EMPLOYEE_IDENTIFICATION_NUMBER) matri,COALESCE(G.EMPLOYEE_SURNAME,H.EMPLOYEE_SURNAME) nom,G.hjmalad,H.hjcredhe,COALESCE(G.TOTAL_DATE,H.TOTAL_DATE)dat FROM
     
        (SELECT EMPLOYEE_IDENTIFICATION_NUMBER,EMPLOYEE_SURNAME,TOTAL_DATE,HOURS hjmalad
         FROM ESTIMATED_DAILY_ABSENCE
         WHERE ABS_TYPE_ABBREVIATION='MAL')G 
     
        full JOIN
     
        (SELECT EMPLOYEE_IDENTIFICATION_NUMBER,EMPLOYEE_SURNAME,TOTAL_DATE,HOURS hjcredhe
         FROM ESTIMATED_DAILY_ABSENCE
         WHERE ABS_TYPE_ABBREVIATION='CH')H
     
        ON G.EMPLOYEE_IDENTIFICATION_NUMBER=H.EMPLOYEE_IDENTIFICATION_NUMBER AND G.TOTAL_DATE=H.TOTAL_DATE)I
     
    ON C.matri=I.matri AND C.dat=I.dat
     
    full JOIN
     
    (SELECT J.EMPLOYEE_IDENTIFICATION_NUMBER matri,J.EMPLOYEE_SURNAME nom,J.hjabsaut,K.hjabsaut2,J.TOTAL_DATE dat FROM
     
        (SELECT EMPLOYEE_IDENTIFICATION_NUMBER,EMPLOYEE_SURNAME,TOTAL_DATE,HOURS hjabsaut
         FROM ESTIMATED_DAILY_ABSENCE
         WHERE ABS_TYPE_ABBREVIATION IN ('PAT','DELEG','RCTp'))J
     
    	full join
     
    	(SELECT EMPLOYEE_IDENTIFICATION_NUMBER,EMPLOYEE_SURNAME,TOTAL_DATE,HOURS hjabsaut2
         FROM ESTIMATED_DAILY_ABSENCE
         WHERE ABS_TYPE_ABBREVIATION ='autre')K
     
    	 ON J.EMPLOYEE_IDENTIFICATION_NUMBER=K.EMPLOYEE_IDENTIFICATION_NUMBER AND J.TOTAL_DATE=K.TOTAL_DATE)L
     
     
    ON C.matri=L.matri AND C.dat=L.dat
     
    where C.matri ='51011' AND C.dat >= '20121201' AND C.dat <= '20121220'
     
    ORDER BY C.dat,C.matri
    Encore un grand merci à vous de m'avoir aidé.

    Jérôme

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Citation Envoyé par jerome_88550 Voir le message
    J'ai testé la fonction pivot mais sans succés dans l'exemple vous avez créé une table "totabs" mais je doit pas passer par une table temporaire je peut seulement interoger la base je n'arrive donc pas à la faire fonctionner. c'est surement du a mon manque de connaisance en SQL :\
    Il n'y a pas de table temporaire, la clause WITH permet, si vous préférez, de déclarer des vues en début de requête.
    Compte tenu que vous avez déjà vos tables TOTAL et ABSENCE, votre requête doit commencer ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WITH totabs (Mat, Nom, [Type], [Hours], [Date]) AS
    (
    SELECT Mat, Nom, [Type] , [Hours], [Date] FROM total
     union ALL
    SELECT Mat, Nom, [Type2], [Hours], [Date] FROM absence
    )
    SELECT ...
    Laissez tomber les FULL JOIN, c'est la probablement la pire solution à ce problème.

  14. #14
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par jerome_88550 Voir le message

    @Islamov2000 :

    Pour info j'avais plus de type dans la table absence j'ai donc du modifier un peu le code mais je ne sais pas si c'est propre mais cela fonctionne :
    Moi je recommande la deuxieme solution que j'ai proposé. elle est courte, plus lisible et facile à entretenir.

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    Encore merci a vous

    Donc j'ai pris la solution de islamov2000 et cela fonctionne comme je le souhaite.

    J'ai du ajouté plusieurs type par colonne j'ai donc utilisé IN ( ... , ... , ... ) est-ce la meilleur methode ?

    Sinon j'avais une interrogation comment il fait pour trouver le type2 car on lui demande de verifier si type = 'MAL' qui se trouve dans type2 ? ça fonctionne mais je voulais savoir comment


    voici la requete modifié :

    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
     
    with l_union AS
    (SELECT * FROM ESTIMATED_DAILY_TOTAL Where TYPE_ABBREVIATION = 'eff' OR TYPE_ABBREVIATION = 'th'
    union
    SELECT * FROM ESTIMATED_DAILY_ABSENCE
     )
     
    SELECT EMPLOYEE_IDENTIFICATION_NUMBER matri,
           SUBSTRING (convert(varchar,TOTAL_DATE,103),7,4) + SUBSTRING (convert(varchar,TOTAL_DATE,103),4,2) + SUBSTRING (convert(varchar,TOTAL_DATE,103),1,2)  dat,
           SUM(CASE WHEN TYPE_ABBREVIATION = 'th' THEN HOURS  END) hjtheo,
           SUM(CASE WHEN TYPE_ABBREVIATION = 'eff' THEN HOURS  END) hjpoin,
           SUM(CASE WHEN TYPE_ABBREVIATION IN ('CP','CPA','CPR') THEN HOURS  END) hjcong,
           SUM(CASE WHEN TYPE_ABBREVIATION = 'RTT' THEN HOURS  END) hjrtt,
           SUM(CASE WHEN TYPE_ABBREVIATION IN ('MAL','MALNI','MAT','PAT','MP','AT','ATNI') THEN HOURS  END) hjmalad,
           SUM(CASE WHEN TYPE_ABBREVIATION = 'CH' THEN HOURS  END) hjcredhe,
           SUM(CASE WHEN TYPE_ABBREVIATION IN ('ABSA','ABSNA','ALT','CEM','CEF','CM','CSS','DELEG','DEP','FORM2','FORM','GREVE','MAP') THEN HOURS  END) hjabsaut
     
     
     
    FROM l_union
     
    where EMPLOYEE_IDENTIFICATION_NUMBER = '51550' and TOTAL_DATE >= '20121201' and TOTAL_DATE <= '20121220'
     
    GROUP BY EMPLOYEE_IDENTIFICATION_NUMBER,TOTAL_DATE
    ORDER BY TOTAL_DATE,EMPLOYEE_IDENTIFICATION_NUMBER
    Merci ,

    Jérôme

  16. #16
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut

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

Discussions similaires

  1. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/07/2024, 16h41
  2. [ DB2 ] [ AS400] requête sql
    Par zinaif dans le forum DB2
    Réponses: 6
    Dernier message: 23/08/2008, 20h42
  3. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 19h38
  4. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 17h26
  5. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 12h37

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