SQL, Access, Questions...
Remad
Messages postés
1694
Statut
Membre
-
LatelyGeek Messages postés 1774 Date d'inscription Statut Membre Dernière intervention -
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
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
A voir également:
- SQL, Access, Questions...
- Logiciel sql - Télécharger - Bases de données
- Access appdata - Guide
- Acer quick access - Forum logiciel systeme
- Désinstaller ACER QUICK ACCESS - Forum Logiciels
- Requête sql pix - Forum Python
15 réponses
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
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
Remad
Messages postés
1694
Statut
Membre
716
Pas bête ! Merci du conseil, je vais essayer je vous tient au courant.
Remad
Messages postés
1694
Statut
Membre
716
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.
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...
Juste filer des pistes et des conseils. Sinon j'y passerais mes journées entières...
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".
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".
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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]);
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]);
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)
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)
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]);
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]);
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 '
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 '
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" ....
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" ....
Dans le GROUP BY, on doit retrouver le même champ que dans le SELECT...
Poste ta requête pour voir ?
Poste ta requête pour voir ?
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...
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...
c'est normal, ton group by contient deux champs, mais ils doivent être les deux premiers de ton select...
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...
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...
Euh ouais, mais si je marque sa directement sous access, il aime pas vu qu'il y a 2 requètes a la suite...
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.
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.