{Access} Code SQL

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. 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
    1. 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.
      1. 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
        1. 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...
          1. 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
            1. 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
              1. 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
                1. 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
                  1. 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.
                    1. 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!
                      1. 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.
                        1. 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
                          1. 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.