SQL, Access, Questions...

Remad Messages postés 1694 Statut Membre -  
LatelyGeek Messages postés 1774 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour a tous !

J'aimerais savoir si il y a une fonction en SQL qui permet de "traduire" un nombre en mois. Je m'explique :

Fonction(2) => "Février"
Fonction(10) => "Octobre"

Existe-t-elle ?
Sa ne me dérange pas que l'affichage soit en Anglais.

Ensuite, j'ai un petit soucis avec une requète sur une table sous acces 2002 (eh oui, encore...)

Voici le genre de ma table qui se nomme Af_table2 :
http://www.filebam.com/download/56223-6eaa6c/Rqte1.JPG

Il y a donc un numéro de demande (ZWU_NUM_DEM), un statut de la demande, et la date ou la demande a pris ce statut.

Jusque la, tout va bien.

Ensuite, il me faudrait une requète qui me donnerait la durée entre le statut "T" et le statut "X' ou "Z" par demande.

J'ai essayé de faire :
SELECT Af_table2.ZWU_NUM_DEM As num_dem, ((SELECT Af_table2.Date FROM Af_table2 WHERE (Af_table2.Statut="X" OR Af_table2.Statut="Z" )) - (SELECT Af_table2.Date FROM Af_table2 WHERE( Af_table2.Statut="T"))) As Temps
FROM Af_table2;

Aucun résultat : "Cette sous requète ne peut retourner au plus qu'un enregistrement."

Je sais pas du tout comment faire, Date-Date=Jours non ?

Je connais pas du tout le VBA, je sais pas ou le placer sous access. Je suis en stage en ce moment et mon supérieur veut absolument une base de donnée avec une colonne "Numéro de la demande" et une autre "Durée (en jours) entre "T" et "X" ou "Z"...

Comment faire ?

Merci d'avance

15 réponses

  1. LatelyGeek Messages postés 1774 Date d'inscription   Statut Membre Dernière intervention   550
     
    Réponse à la première question:

    Format(DateSerial(1900,[NumMois],1),"mmmm")

    Et à la deuxième: Tu lui demandes de soustraire des champs qui ne se trouvent pas dans le même enregistrement. Impossible comme ça!!! C'est exactement ce pour quoi Access n'est pas fait. On n'est pas dans Excel.

    Je ne sais pas comment sont oragnisées tes données à la base, mais si les T et les X sont dans des enregistrement différents, j'ai une piste qui me vient à l'esprit - Si c'est pas la meilleur, les autres, à vos claviers...

    1 - Tu crées une table avec au moins 5 champs: Z_Num_Dem, StatutT, StatutNonT, DateT, DateNonT
    2 - Tu fais une requête qui ajoutes tous les enregistrements de statut T avec leur date et le ZNum
    3 - Tu fais une requête MAJ qui rempliras les champs DateNonT de chaque ZNum- la table et la requête initiale étant liées par le ZNumDem

    Et de cette table tu pourras soustraire DateT et DateNonT

    0
    1. Remad Messages postés 1694 Statut Membre 720
       
      Pas bête ! Merci du conseil, je vais essayer je vous tient au courant.
      0
    2. Remad Messages postés 1694 Statut Membre 720
       
      Mais j'ai a peu près 1900 tuples... Sa va pas être un peu lourd? Tu ne pourrais pas m'aider a créer les requètes? Je suis pas vraiment doué la dedans.
      0
  2. LatelyGeek Messages postés 1774 Date d'inscription   Statut Membre Dernière intervention   550
     
    Non, ça ne sera pas lourd, et non, je ne peux pas t'aider à créer les requêtes.

    Juste filer des pistes et des conseils. Sinon j'y passerais mes journées entières...
    0
  3. Remad Messages postés 1694 Statut Membre 720
     
    Ok jcomprends.
    Mais pour les mois, sa pose un problème, dans le SELECT, j'ai beau mettre :
    Format(DateSerial(1900,Af_table.Mois_dem,1),"mmmm")
    il me réponds "la syntaxe de l'expression d'entrée n'est pas correcte, vous avez peut être entré un opérande sans opérateur".
    0
  4. LatelyGeek Messages postés 1774 Date d'inscription   Statut Membre Dernière intervention   550
     
    Donne moi toute la syntaxe de ton SELECT, je vais essayer de comprendre.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Remad Messages postés 1694 Statut Membre 720
     
    SELECT
    DISTINCT Af_table.Année_dem, Af_table.Mois_dem, ([Domaine]) AS [Nom du Domaine], Count(([Domaine])) AS Nombre
    INTO Af_Dom

    FROM Af_table

    WHERE
    (((Af_table.Mois_dem)=4 Or (Af_table.Mois_dem)=5 Or (Af_table.Mois_dem)=6 Or (Af_table.Mois_dem)=7 Or (Af_table.Mois_dem)=8 Or (Af_table.Mois_dem)=9 Or (Af_table.Mois_dem)=10 Or (Af_table.Mois_dem)=11 Or (Af_table.Mois_dem)=12)
    AND ((Af_table.Année_dem)=[Année IATA?])
    AND ((Af_table.Statut)="X" Or (Af_table.Statut)="Z"))

    OR (((Af_table.Mois_dem)=1 Or (Af_table.Mois_dem)=2 Or (Af_table.Mois_dem)=3)
    AND ((Af_table.Année_dem)=([Année IATA?]+1))
    AND ((Af_table.Statut)="X" Or (Af_table.Statut)="Z"))

    GROUP BY Af_table.Année_dem, Af_table.Mois_dem, ([Domaine])

    ORDER BY Af_table.Année_dem, Af_table.Mois_dem, ([Domaine]);
    0
  7. LatelyGeek Messages postés 1774 Date d'inscription   Statut Membre Dernière intervention   550
     
    Plusieurs réflexions:

    Dans le SELECT que tu m'envoies, il n'y a pas de SerialDate... Comment veux tu que je trouve ce qui ne fonctionne pas?????

    Et l'autre truc, c'est qu'un petit Af_table.Mois_dem>=4 aurait été un peu plus léger... Heureusement qu'il n'y a que 12 mois dans l'année!!!

    Remarque:
    Si Mois_dem est de type texte, tu le remplaces par Val(Af_Table.Mois_Dem)
    0
    1. Remad Messages postés 1694 Statut Membre 720
       
      La fonction est SerialDate ou DateSerial ? Enfin, mois_dem n'as pas de type spécifique vu que la table est supprimé et reformé a chaque fois que je fais ma requète, me demande pas pourquoi...

      Avec la fonction sa donnerait :

      SELECT
      DISTINCT Af_table.Année_dem, Format(DateSerial(1900,Af_table.Mois_dem,1),"mmmm") , ([Domaine]) AS [Nom du Domaine], Count(([Domaine])) AS Nombre
      INTO Af_Dom

      FROM Af_table

      WHERE
      (((Af_table.Mois_dem)>=4)
      AND ((Af_table.Année_dem)=[Année IATA?])
      AND ((Af_table.Statut)="X" Or (Af_table.Statut)="Z"))

      OR (((Af_table.Mois_dem)<4)
      AND ((Af_table.Année_dem)=([Année IATA?]+1))
      AND ((Af_table.Statut)="X" Or (Af_table.Statut)="Z"))

      GROUP BY Af_table.Année_dem, Af_table.Mois_dem, ([Domaine])

      ORDER BY Af_table.Année_dem, Af_table.Mois_dem, ([Domaine]);
      0
  8. LatelyGeek Messages postés 1774 Date d'inscription   Statut Membre Dernière intervention   550
     
    essaye de rajouter ça au cas où, mais je ne suis pas sûre que ça soit ça qui bloque:
    Format(DateSerial(1900,Af_table.Mois_dem,1),"mmmm") AS MoisLettres

    Si tu mets juste Af_table.Mois_Dem, ton SQL marche???
    Ah oui, aussi, remplace les " par '
    0
    1. Remad Messages postés 1694 Statut Membre 720
       
      Avec jsute "Af_table.Mois_Dem", tout marche.

      Avec "Format(DateSerial(1900,Af_table.Mois_dem,1),"mmmm") AS MoisLettres", j'ai maintenant le message d'erreur "La clause ORDER BY (Af_table.Mois_dem) est en conflit avec DISTINCT"...
      0
      1. blux Messages postés 2051 Date d'inscription   Statut Modérateur Dernière intervention   3 455 > Remad Messages postés 1694 Statut Membre
         
        Salut,

        le mieux, c'est que tu mettes order by 1, comme ça, il fait le tri sur la première colonne, quel que soit son nom...
        sinon, af_table.mois_dem n'est pas connu en tant que tel...
        0
  9. LatelyGeek Messages postés 1774 Date d'inscription   Statut Membre Dernière intervention   550
     
    Et avec ORDER BY MoisLettres???
    0
  10. Remad Messages postés 1694 Statut Membre 720
     
    LatelyGeek, avec MoisLettres, sa me fait la même erreur sauf que le nom de la variable est différent.
    Blux, si je retire MoisLettres, je tombe sur l'erreur "Vous avez essayer d'éxécuter une requète Ne comprenant pas "Format(DateSerial(1900,Af_table.Mois_dem,1),"mmmm")" comme une partie de la fonction d'agrégat" ....
    0
    1. blux Messages postés 2051 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      je parle de mettre order by 1, en laisssant le reste...
      0
  11. LatelyGeek Messages postés 1774 Date d'inscription   Statut Membre Dernière intervention   550
     
    Bon. Procédons par ordre. Si tu ORDER BY rien du tout, ça fait quoi?
    0
    1. Remad Messages postés 1694 Statut Membre 720
       
      En supprimant le ORDER BY, j'ai toujours le même problème d'agrégat...
      0
  12. blux Messages postés 2051 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Dans le GROUP BY, on doit retrouver le même champ que dans le SELECT...

    Poste ta requête pour voir ?
    0
  13. Remad Messages postés 1694 Statut Membre 720
     
    SELECT
    DISTINCT Af_table.Année_dem, Format(DateSerial(1900,Af_table.Mois_dem,1),'mmmm') AS MoisLettres , ([Domaine]) AS [Nom du Domaine], Count(([Domaine])) AS Nombre
    INTO Af_Dom

    FROM Af_table

    WHERE
    (((Af_table.Mois_dem)>=4)
    AND ((Af_table.Année_dem)=[Année IATA?])
    AND ((Af_table.Statut)='X' Or (Af_table.Statut)='Z'))

    OR (((Af_table.Mois_dem)<4)
    AND ((Af_table.Année_dem)=([Année IATA?]+1))
    AND ((Af_table.Statut)='X' Or (Af_table.Statut)='Z'))

    GROUP BY Af_table.Année_dem, ([Domaine])

    ORDER BY Af_table.Année_dem, ([Domaine]);

    Et avec sa j'ai toujours le truc de l'agrégat...
    0
  14. blux Messages postés 2051 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    c'est normal, ton group by contient deux champs, mais ils doivent être les deux premiers de ton select...
    0
    1. Remad Messages postés 1694 Statut Membre 720
       
      Du nouveau :
      avec

      SELECT DISTINCT Af_table.Année_dem, Format(DateSerial(1900,Af_table.Mois_dem,1),'mmmm') AS MoisLettres, ([Domaine]) AS [Nom du Domaine], Count(([Domaine])) AS Nombre INTO Af_Dom
      FROM Af_table
      WHERE (((Af_table.Mois_dem)>=4) AND ((Af_table.Année_dem)=[Année IATA?]) AND ((Af_table.Statut)='X' Or (Af_table.Statut)='Z')) OR (((Af_table.Mois_dem)<4) AND ((Af_table.Année_dem)=([Année IATA?]+1)) AND ((Af_table.Statut)='X' Or (Af_table.Statut)='Z'))
      GROUP BY Af_table.Année_dem, Format(DateSerial(1900,Af_table.Mois_dem,1),'mmmm'), [Nom du Domaine]
      ORDER BY Af_table.Année_dem, Format(DateSerial(1900,Af_table.Mois_dem,1),'mmmm'), [Nom du Domaine];

      Il me sort "La clause ORDER BY ([Nom du domaine]) est en conflit avec DISTINCT"...

      Je vais bien, tout va bien...
      0
    2. blux Messages postés 2051 Date d'inscription   Statut Modérateur Dernière intervention   3 455 > Remad Messages postés 1694 Statut Membre
       
      ORDER BY 1,2,3 ?
      0
    3. Remad Messages postés 1694 Statut Membre 720 > blux Messages postés 2051 Date d'inscription   Statut Modérateur Dernière intervention  
       
      Erreur "Vous avez essayer d'éxécuter une requète Ne comprenant pas 'Nom du domaine' comme une partie de la fonction d'agrégat"
      0
    4. blux Messages postés 2051 Date d'inscription   Statut Modérateur Dernière intervention   3 455 > Remad Messages postés 1694 Statut Membre
       
      ???

      si tu supprimes les AS de renommage des colonnes ?
      0
    5. Remad Messages postés 1694 Statut Membre 720 > blux Messages postés 2051 Date d'inscription   Statut Modérateur Dernière intervention  
       
      Pareil, sauf que c'est 'domaine' qui parle d'agrégat maintenant...
      0
  15. Remad Messages postés 1694 Statut Membre 720
     
    Euh ouais, mais si je marque sa directement sous access, il aime pas vu qu'il y a 2 requètes a la suite...
    0
    1. blux Messages postés 2051 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      tu modifies ta requête initiale, celle qui marche, pour supprimer la notion de mois en toutes lettres, le Format(DateSerial(1900,Af_table.Mois_dem,1),'mmmm') que tu remplaces par Af_table.Mois_dem partout où tu le vois. ta requête est maintenant correcte sauf qu'elle n'affiche pas le mois en toutes lettres.

      Tu enregistres cette requête sous un nom qui te plait, et tu crées une autre requête qui se base sur la requête que tu viens d'enregistrer. Il te suffit de faire un select des champs renvoyés par la requête avec reformatage pour mettre le mois en toutes lettres (format(("01/" & Requête4.expr1 & "/1900"),"mmmm") et de mettre en autre critère de tri le numéro du mois, comme dans l'exemple que je t'ai donné au-dessus... C'est plus clair ? Sinon, ça devra attendre, je m'en vais du boulot...

      Une requête peut avoir comme source de données une autre requête, ce n'est pas un problème.
      0
  16. LatelyGeek Messages postés 1774 Date d'inscription   Statut Membre Dernière intervention   550
     
    Moi je suis pas partie du boulot, si tu as encore besoin, mais ce que dit Blux devrait fonctionner.
    0