Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Membre actif
    Inscrit en
    mai 2007
    Messages
    782
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : mai 2007
    Messages : 782
    Points : 194
    Points
    194

    Par défaut conseil sur requete

    bonjour,

    Soit la requete suivante qui me sort les heures travaillées par employé et par mois.

    Elle fonctionne bien mais le classement par mois me donne par exemple:
    1-2012
    10-2012
    -
    -
    6-2012
    9-2012
    les mois ne sont pas dans l'ordre ?

    est ce qu'il y a une astuce pour contourner ce problème ?

    (Je suis sous FB2.1)

    Code :
    1
    2
    3
    4
    5
    6
    7
     
    SELECT coalesce(EMPLOYE.EMPRENOM || ' ',' ') || EMPLOYE.EMNOM AS PATRO,
    extract(month FROM heures.ptdate)|| '-' || extract(year FROM heures.ptdate) AS MOIS, sum(heures.pttime) AS  TOTAL FROM HEURES
    JOIN EMPLOYE ON EMPLOYE.EMIDEMP=heures.ptidemp
    JOIN CMDCLI ON CMDCLI.COIDCDE=heures.ptidcde
    GROUP BY  MOIS, PATRO
    ORDER BY  MOIS
    merci

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    janvier 2009
    Messages
    457
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2009
    Messages : 457
    Points : 699
    Points
    699

    Par défaut

    Bonjour,

    Il est possible de traiter ton problème avec le code

    Code :
    1
    2
    3
    4
    5
    6
    7
    SELECT coalesce(EMPLOYE.EMPRENOM || ' ',' ') || EMPLOYE.EMNOM AS PATRO,
      RIGHT('00' || extract(month FROM heures.ptdate)|| '-' || extract(year FROM heures.ptdate), 7) AS MOIS, 
      sum(heures.pttime) AS  TOTAL FROM HEURES
    JOIN EMPLOYE ON EMPLOYE.EMIDEMP=heures.ptidemp
    JOIN CMDCLI ON CMDCLI.COIDCDE=heures.ptidcde
    GROUP BY  MOIS, PATRO
    ORDER BY  MOIS
    Il faut mettre un zéro devant les mois 1 à 9 pour permettre un alignement. Ton tri se fait sur des caractères. C'est pour cette raison que 10 et placé avant 6. C'est mal expliqué, mais je pense que tu comprendras.

    Les ajouts sont en rouge et gras

    J'ai fait un test

    Code :
    1
    2
    3
    4
     
    02-2012
    06-2012
    10-2012
    A+

  3. #3
    Rédacteur/Modérateur
    Avatar de SergioMaster
    Homme Profil pro Serge Girard
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    5 298
    Détails du profil
    Informations personnelles :
    Nom : Homme Serge Girard
    Âge : 58
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 5 298
    Points : 9 675
    Points
    9 675

    Par défaut

    Bonjour,
    le fait que l'ordre ne soit pas 'Logique' est que
    Code :
    extract(month FROM heures.ptdate)|| '-' || extract(year FROM heures.ptdate) AS MOIS
    fourni un varchar donc le tri est alphanumérique et non numérique

    1° solution Inverser MM-AAAA en AAAA-MM , cependant il faudrait que MM soit avec des Zéros non significatifs , ce qui ne sera pas le cas sauf a utiliser LPAD(extract(Month FROM heures.ptdate),2,0)

    ce qui donnerai ceci
    Code :
    1
    2
    3
    4
    5
    6
    7
    SELECT 
    extract(Year FROM heures.ptdate)|| '-' || LPAD(extract(Month FROM heures.ptdate),2,0) AS MOIS,
    coalesce(EMPLOYE.EMPRENOM || ' ',' ') || EMPLOYE.EMNOM AS PATRO, sum(heures.pttime) AS  TOTAL 
    FROM HEURES
    JOIN EMPLOYE ON EMPLOYE.EMIDEMP=heures.ptidemp
    JOIN CMDCLI ON CMDCLI.COIDCDE=heures.ptidcde
    GROUP BY  1,2


    2° solution (la plus simple) Mois devient numérique
    Code :
    extract(Year FROM heures.ptdate)*100+extract(Month FROM heures.ptdate) AS NUMMOIS
    ce qui donnerai ceci
    Code :
    1
    2
    3
    4
    5
    6
    7
    SELECT extract(Year FROM heures.ptdate)*100+extract(Month FROM heures.ptdate) AS NUMMOIS,
    extract(month FROM heures.ptdate)|| '-' || extract(year FROM heures.ptdate) AS MOIS,
    coalesce(EMPLOYE.EMPRENOM || ' ',' ') || EMPLOYE.EMNOM AS PATRO, sum(heures.pttime) AS  TOTAL 
    FROM HEURES
    JOIN EMPLOYE ON EMPLOYE.EMIDEMP=heures.ptidemp
    JOIN CMDCLI ON CMDCLI.COIDCDE=heures.ptidcde
    GROUP BY  1,2,3
    le ORDER BY est inutile

    3° Solution (que je ne maitrise pas donc juste une piste) l'indication de
    d'un CHARSET d'un COLLATE , j'ai déjà lu cela quelque part, mais où ?
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

  4. #4
    Membre actif
    Inscrit en
    mai 2007
    Messages
    782
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : mai 2007
    Messages : 782
    Points : 194
    Points
    194

    Par défaut réponse

    bonjour,

    Tout fonctionne parfaitement.
    J'ai adapté la requete sur une extraction par semaine et ca fonctionne bien aussi.

    merci pour votre aide

    cordialement

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •