{Access} Code SQL

Fermé
hadrianovich Messages postés 30 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 25 septembre 2009 - 10 août 2009 à 15:49
moderno31 Messages postés 870 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 8 août 2012 - 12 août 2009 à 16:48
Bonjour,


Voilà je suis en train de créer un tableau de bord et je fais mes requêtes et par curiosité je me demandé si il est possible de regrouper plusieurs requêtes ( en une seule ) du type:

SELECT SUM(Devis.P1) AS Expr1
FROM Devis INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet
WHERE ((Devis.[Date de restitution])>#12/31/2008# And (Devis.[Date de restitution])<#2/1/2009#);

SELECT SUM(Devis.P1) AS Expr2
FROM Devis INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet
WHERE ((Devis.[Date de restitution])>#01/31/2009# And (Devis.[Date de restitution])<#3/1/2009#);

SELECT SUM(Devis.P1) AS Expr3
FROM Devis INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet
WHERE ((Devis.[Date de restitution])>#02/28/2009# And (Devis.[Date de restitution])<#4/1/2009#);

... et ce jusque la fin de l'année!

Cela me permettrait en effet de ne pas avoir de problème avec le nombre maximum de requêtes imposées par access

Merci d'avance :)
A voir également:

14 réponses

moderno31 Messages postés 870 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 8 août 2012 92
10 août 2009 à 17:20
HEllo,
Essaye de voir si UNION ou UNION ALL fonctionne avec access.
Entre chaque bout de requete tu met ça.

Par contre il s'agit de la meme table à des dates différentes.
sinon Je ne comprends pas vien ce que tu veux faire.
0
hadrianovich Messages postés 30 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 25 septembre 2009
10 août 2009 à 17:37
Salut!!
Merci de ta réponses j'ai déjà essayé mais ça ne marche pas...
En gros ce que je désire est d'avoir un tableau d'une seule ligne avec pour chaque mois le nombre de devis c'est pour ca que je les ai regroupé par date dans mon code sql mais pour l'instant je suis obligé de faire une requête pour chaque mois et de les regrouper après...

Hadrien
0
moderno31 Messages postés 870 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 8 août 2012 92
10 août 2009 à 18:09
Hadrien ?
Ouaw j'adore la façon dont ton prénom/pseudo s'écrit.. Trop bien lol

Heu donc, tu veux avoir pour chaque mois le total de devis.p1 ?
Tu peux me mettre comme ça
Select month(date-restitution dans le format anglais comme tu as mis) as mois, sum(devis.p1) as total_devis from table...plus reste de que requete. avec clause where = que l'année 2009. Il te le sortira mois par mois et sommé. Oublie pas de faire un groupe by sur la colonne mois.
0
hadrianovich Messages postés 30 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 25 septembre 2009
11 août 2009 à 09:33
Salut!

Merci de ta réponse j'ai tenté :

Select month(date_restitution) AS mois, sum(devis.p1) as total_devis FROM Devis INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet group by month

Mais il me demande une date et je ne sais pas pourquoi...

Merci!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
moderno31 Messages postés 870 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 8 août 2012 92
11 août 2009 à 14:52
Re,
il n'y a plus de clause WHERE.
Aussi astu vérifié le format de ton champ date ?
Month ne fonctionne qu'avec des date du format orignal DATETIME anglais.

Quand je teste access 2003 version Fr ne sait pas afficher de date dans ce format.
Par contre que je fait month(date_ta_date au format date/heure) il me revoie bien le mois.
0
hadrianovich Messages postés 30 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 25 septembre 2009
12 août 2009 à 09:39
Bonjour,

Merci de ta réponse je regarde pour le format de la date.
Je n'ai pas besoin de clause where si il me trie déjà les montants par mois et qu'il me les regroupe en faisant le total.

Hadrien
0
moderno31 Messages postés 870 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 8 août 2012 92
12 août 2009 à 09:43
ok,
j'ai poussé un peu et en version Fr de Access pas de date format datetime anglais.
month, day, year renvoient bien les éléments attendus de DATE_JJMMAAAA
0
hadrianovich Messages postés 30 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 25 septembre 2009
12 août 2009 à 10:09
Rebonjour,

Voilà j'ai une autre question , est t'il possible de faire quelquechose du type:

Select month(date_restitution) AS mois, sum(devis.p1) as total_devis , YEAR(date_restitution) as année
FROMDevis INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet group by mois
avec un group by year quelquepart pour qu'en plus il me rajoute les années à côté du mois?

Merci
0
hadrianovich Messages postés 30 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 25 septembre 2009
12 août 2009 à 10:28
Voilà le problème...


"Vous avez essayé d'exécuter une requête ne comprenant pas l'expression spécifiée "month(Devis.[date de restitution])" comme une partie de la fonction d'agrégat."

Pour :Select month(date_restitution) AS mois, sum(devis.p1) as total_devis FROM Devis INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet group by mois
0
moderno31 Messages postés 870 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 8 août 2012 92
12 août 2009 à 16:22
Oula j'ai pas suivi, tu as fait ta req et access ta renvoyé une erreur c'est ça ?
Ma correction
SELECT MONTH(date_restitution) AS mois
,SUM(devis.p1) AS total_devis
,YEAR(date_restitution) as année 
FROM Devis 
INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet 
GROUP BY MONTH(date_restitution), YEAR(date_restitution)


J'ai pris l'habitude de faire mes group by sur l'intitulé original des champs. Pas sur leur alias.
Sous SQL server ça ne passe pas de group by sur alias.
De même que j'ai pris l'habitude de ne faire que des LEFT JOIN, comme ça je suis au courant lorqu'une jointure n'a pu etre faite (NULL). Le INNER va te renvoyer que les jointures possibles.

Dit moi si tu as des soucis avec le month(date...) sous access. Et si oui fait moi voir ce que tu lui écrit. J'ai testé ça marche...
0
hadrianovich Messages postés 30 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 25 septembre 2009
12 août 2009 à 16:27
bonjour à tous !

Voilà j'ai essayé avec UNION quelque chose du type

SELECT COUNT(Devis.P1) AS JANVIER
FROM Devis INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet
WHERE (((Projet.Niv)="0") AND ((Devis.[Date de restitution])>#12/31/2008# And (Devis.[Date de restitution])<#2/1/2009#))
UNION
SELECT COUNT(Devis.P1) AS FEVRIER
FROM Devis INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet
WHERE (((Projet.Niv)="0") And ((Devis.[Date de restitution])>#1/31/2009# And (Devis.[Date de restitution])<#3/1/2009#))
UNION
SELECT COUNT(Devis.P1) AS MARS
FROM Devis INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet
WHERE (((Projet.Niv)="0") And ((Devis.[Date de restitution])>#2/28/2009# And (Devis.[Date de restitution])<#4/1/2009#))
UNION
SELECT COUNT(Devis.P1) AS AVRIL
FROM Devis INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet
WHERE (((Projet.Niv)="0") And ((Devis.[Date de restitution])>#3/31/2009# And (Devis.[Date de restitution])<#5/1/2009#))
UNION
SELECT COUNT(Devis.P1) AS MAI
FROM Devis INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet
WHERE (((Projet.Niv)="0") And ((Devis.[Date de restitution])>#4/30/2009# And (Devis.[Date de restitution])<#6/1/2009#))
UNION
SELECT COUNT(Devis.P1) AS JUIN
FROM Devis INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet
WHERE (((Projet.Niv)="0") And ((Devis.[Date de restitution])>#5/31/2009# And (Devis.[Date de restitution])<#7/1/2009#))
UNION
SELECT COUNT(Devis.P1) AS JUILLET
FROM Devis INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet
WHERE (((Projet.Niv)="0") And ((Devis.[Date de restitution])>#6/30/2009# And (Devis.[Date de restitution])<#8/1/2009#))
UNION
SELECT COUNT(Devis.P1) AS AOUT
FROM Devis INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet
WHERE (((Projet.Niv)="0") And ((Devis.[Date de restitution])>#7/31/2009# And (Devis.[Date de restitution])<#9/1/2009#))
UNION
SELECT COUNT(Devis.P1) AS SEPTEMBRE
FROM Devis INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet
WHERE (((Projet.Niv)="0") And ((Devis.[Date de restitution])>#8/31/2009# And (Devis.[Date de restitution])<#10/1/2009#))
UNION
SELECT COUNT(Devis.P1) AS OCTOBRE
FROM Devis INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet
WHERE (((Projet.Niv)="0") And ((Devis.[Date de restitution])>#9/30/2009# And (Devis.[Date de restitution])<#11/1/2009#))
UNION
SELECT COUNT(Devis.P1) AS NOVEMBRE
FROM Devis INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet
WHERE (((Projet.Niv)="0") AND ((Devis.[Date de restitution])>#10/31/2009# And (Devis.[Date de restitution])<#12/1/2009#))
UNION SELECT COUNT(Devis.P1) AS DECEMBRE
FROM Devis INNER JOIN Projet ON Devis.Num_devis=Projet.Num_Projet
WHERE (((Projet.Niv)="0") And ((Devis.[Date de restitution])>#11/30/2009# And (Devis.[Date de restitution])<#1/1/2010#));



Il m'affiche bien les données que je veut sauf qu'elles sont positionnées très bizarrement à savoir qu'en fait avec cette formule j'obtiens tout dans la même colonne(ici janvier)
L'autre problème est qu'il ne m'affiche rien quand le resultat est égal à zéro!

Voilà j'espère que vous allez pouvoir m'aider

Hadrien
0
moderno31 Messages postés 870 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 8 août 2012 92
12 août 2009 à 16:35
Perso j'ai pas le truc sous les yeux donc ça devient complicated.
Je ne connais pas la structure de tes données donc j'ai un peu de mal à te conseiller. Si tu étais mon voisin ça serait simple :MDR

Par contre pourquoi tu nes fais pas une requetes pour l'année, avec un champ "mois" dans ton select, puis un group by à la fin à cause de ton SUM.
0
hadrianovich Messages postés 30 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 25 septembre 2009
12 août 2009 à 16:43
C'est bon a partir de ce que tu viens de me donner je vais pouvoir tout faire!!

Merci beaucoup et bonne continuation a toi :)


hadrien
0
moderno31 Messages postés 870 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 8 août 2012 92
12 août 2009 à 16:48
cool, parfait.
a la prochaine
0