{Access} Code SQL

hadrianovich Messages postés 34 Statut Membre -  
moderno31 Messages postés 900 Statut Membre -
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 :)
Configuration: Mac OS X
Safari 525.27.1

14 réponses

  1. moderno31 Messages postés 900 Statut Membre 92
     
    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
  2. hadrianovich Messages postés 34 Statut Membre
     
    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
  3. moderno31 Messages postés 900 Statut Membre 92
     
    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
  4. hadrianovich Messages postés 34 Statut Membre
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. moderno31 Messages postés 900 Statut Membre 92
     
    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
  7. hadrianovich Messages postés 34 Statut Membre
     
    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
  8. moderno31 Messages postés 900 Statut Membre 92
     
    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
  9. hadrianovich Messages postés 34 Statut Membre
     
    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
  10. hadrianovich Messages postés 34 Statut Membre
     
    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
  11. moderno31 Messages postés 900 Statut Membre 92
     
    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
  12. hadrianovich Messages postés 34 Statut Membre
     
    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
  13. moderno31 Messages postés 900 Statut Membre 92
     
    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
  14. hadrianovich Messages postés 34 Statut Membre
     
    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
  15. moderno31 Messages postés 900 Statut Membre 92
     
    cool, parfait.
    a la prochaine
    0