Access SQL Subquery to find a value from the previous year record (Max/Top minus 1)





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















All the advice I was able to locate doesn't seem to get at this (I am also trying to avoid a DLookup in the Table itself):



The table: Table has client records including a Year field, an AppointmentDate field and a ClientName field (which has identical values for each individual client across all years). (Table's client IDs for each record are expectedly random.)



In an MS Access Query that shows a sampling of this year's clients (by ClientName and delimited by a few other factors), need to also show the value of AppointmentDate from the previous year's (max Year minus 1) record for the same client.



Subquery attempts such as the below do not work:



LastYearApptDate:



(SELECT AppointmentDate FROM (SELECT (AppointmentDate) FROM Table ORDER BY Year DESC LIMIT 2) ORDER BY AppointmentDate ASC LIMIT 1)


Nor have the online suggested Top attempts shown the expected result.



(I realize Max is not supported in MS Access.)



Perhaps I am missing something about Access's syntax for a SQL subquery (via the "Zoom" Dialogue).










share|improve this question































    0















    All the advice I was able to locate doesn't seem to get at this (I am also trying to avoid a DLookup in the Table itself):



    The table: Table has client records including a Year field, an AppointmentDate field and a ClientName field (which has identical values for each individual client across all years). (Table's client IDs for each record are expectedly random.)



    In an MS Access Query that shows a sampling of this year's clients (by ClientName and delimited by a few other factors), need to also show the value of AppointmentDate from the previous year's (max Year minus 1) record for the same client.



    Subquery attempts such as the below do not work:



    LastYearApptDate:



    (SELECT AppointmentDate FROM (SELECT (AppointmentDate) FROM Table ORDER BY Year DESC LIMIT 2) ORDER BY AppointmentDate ASC LIMIT 1)


    Nor have the online suggested Top attempts shown the expected result.



    (I realize Max is not supported in MS Access.)



    Perhaps I am missing something about Access's syntax for a SQL subquery (via the "Zoom" Dialogue).










    share|improve this question



























      0












      0








      0








      All the advice I was able to locate doesn't seem to get at this (I am also trying to avoid a DLookup in the Table itself):



      The table: Table has client records including a Year field, an AppointmentDate field and a ClientName field (which has identical values for each individual client across all years). (Table's client IDs for each record are expectedly random.)



      In an MS Access Query that shows a sampling of this year's clients (by ClientName and delimited by a few other factors), need to also show the value of AppointmentDate from the previous year's (max Year minus 1) record for the same client.



      Subquery attempts such as the below do not work:



      LastYearApptDate:



      (SELECT AppointmentDate FROM (SELECT (AppointmentDate) FROM Table ORDER BY Year DESC LIMIT 2) ORDER BY AppointmentDate ASC LIMIT 1)


      Nor have the online suggested Top attempts shown the expected result.



      (I realize Max is not supported in MS Access.)



      Perhaps I am missing something about Access's syntax for a SQL subquery (via the "Zoom" Dialogue).










      share|improve this question
















      All the advice I was able to locate doesn't seem to get at this (I am also trying to avoid a DLookup in the Table itself):



      The table: Table has client records including a Year field, an AppointmentDate field and a ClientName field (which has identical values for each individual client across all years). (Table's client IDs for each record are expectedly random.)



      In an MS Access Query that shows a sampling of this year's clients (by ClientName and delimited by a few other factors), need to also show the value of AppointmentDate from the previous year's (max Year minus 1) record for the same client.



      Subquery attempts such as the below do not work:



      LastYearApptDate:



      (SELECT AppointmentDate FROM (SELECT (AppointmentDate) FROM Table ORDER BY Year DESC LIMIT 2) ORDER BY AppointmentDate ASC LIMIT 1)


      Nor have the online suggested Top attempts shown the expected result.



      (I realize Max is not supported in MS Access.)



      Perhaps I am missing something about Access's syntax for a SQL subquery (via the "Zoom" Dialogue).







      microsoft-access sql query






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Feb 12 at 2:29









      JakeGould

      32.9k10100142




      32.9k10100142










      asked Feb 12 at 2:19









      StumpedStumped

      207




      207






















          2 Answers
          2






          active

          oldest

          votes


















          1














          Below solved by:



          SELECT Table.AppointmentDate
          FROM Table
          WHERE (((Table.ClientName=[Client]) AND ((Year=(SELECT Max(Table.Year) AS PreviousYear
          FROM Table
          WHERE (((Table.Year)<(SELECT MAX(Table.Year) FROM Table WHERE ((Table.ClientName=[Client]))))))));


          Now the challenge is to merge this with Client fields (like AppointmentDate) from the Table per the most recent year - and to show this for each client. Is there any way to do this without a UNION?






          share|improve this answer

































            0














            Well, after a lot of different attempts at just entering SQL into Access, still missing something important:



            Here are the Pieces so far (okay, so MAX appears to work despite documentation that said otherwise):



            SELECT MAX(Table.Year) 
            FROM Table
            WHERE Table.Year<(SELECT MAX(Table.Year) FROM Table)


            The above correctly selects the previous year (generally for Table).



            The previous year for a particular client can be isolated thus:



            SELECT Max(Table.Year) AS PreviousYear
            FROM Table
            WHERE (((Table.Year)<(SELECT MAX(Table.Year) FROM Table WHERE ((Table.ClientName)=[Client]))));


            Where "Client" is, for now, just entered manually.



            Now the challenge is to select the AppointmentDate value from the previous year's record by way of a common ClientName (and the above PreviousYear value for each ClientName - the PreviousYear values will be different for each Client) - this is where I seem to be missing something important:



            SELECT Table.AppointmentDate
            FROM Table
            WHERE (((Table.ClientName=[Client])) AND ((Table.Year)=(SELECT MAX(Table.Year) AS LastDueDate FROM Table WHERE (((Table.Year)<(SELECT MAX(Table.Year) FROM Table WHERE ((Table.ClientName)=[Client]))))));


            Not sure what's missing, tried: FROM Table t ...



            Any insights would be appreciated - thanks!






            share|improve this answer
























              Your Answer








              StackExchange.ready(function() {
              var channelOptions = {
              tags: "".split(" "),
              id: "3"
              };
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function() {
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled) {
              StackExchange.using("snippets", function() {
              createEditor();
              });
              }
              else {
              createEditor();
              }
              });

              function createEditor() {
              StackExchange.prepareEditor({
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: true,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader: {
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              },
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              });


              }
              });














              draft saved

              draft discarded


















              StackExchange.ready(
              function () {
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsuperuser.com%2fquestions%2f1404667%2faccess-sql-subquery-to-find-a-value-from-the-previous-year-record-max-top-minus%23new-answer', 'question_page');
              }
              );

              Post as a guest















              Required, but never shown

























              2 Answers
              2






              active

              oldest

              votes








              2 Answers
              2






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              1














              Below solved by:



              SELECT Table.AppointmentDate
              FROM Table
              WHERE (((Table.ClientName=[Client]) AND ((Year=(SELECT Max(Table.Year) AS PreviousYear
              FROM Table
              WHERE (((Table.Year)<(SELECT MAX(Table.Year) FROM Table WHERE ((Table.ClientName=[Client]))))))));


              Now the challenge is to merge this with Client fields (like AppointmentDate) from the Table per the most recent year - and to show this for each client. Is there any way to do this without a UNION?






              share|improve this answer






























                1














                Below solved by:



                SELECT Table.AppointmentDate
                FROM Table
                WHERE (((Table.ClientName=[Client]) AND ((Year=(SELECT Max(Table.Year) AS PreviousYear
                FROM Table
                WHERE (((Table.Year)<(SELECT MAX(Table.Year) FROM Table WHERE ((Table.ClientName=[Client]))))))));


                Now the challenge is to merge this with Client fields (like AppointmentDate) from the Table per the most recent year - and to show this for each client. Is there any way to do this without a UNION?






                share|improve this answer




























                  1












                  1








                  1







                  Below solved by:



                  SELECT Table.AppointmentDate
                  FROM Table
                  WHERE (((Table.ClientName=[Client]) AND ((Year=(SELECT Max(Table.Year) AS PreviousYear
                  FROM Table
                  WHERE (((Table.Year)<(SELECT MAX(Table.Year) FROM Table WHERE ((Table.ClientName=[Client]))))))));


                  Now the challenge is to merge this with Client fields (like AppointmentDate) from the Table per the most recent year - and to show this for each client. Is there any way to do this without a UNION?






                  share|improve this answer















                  Below solved by:



                  SELECT Table.AppointmentDate
                  FROM Table
                  WHERE (((Table.ClientName=[Client]) AND ((Year=(SELECT Max(Table.Year) AS PreviousYear
                  FROM Table
                  WHERE (((Table.Year)<(SELECT MAX(Table.Year) FROM Table WHERE ((Table.ClientName=[Client]))))))));


                  Now the challenge is to merge this with Client fields (like AppointmentDate) from the Table per the most recent year - and to show this for each client. Is there any way to do this without a UNION?







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Mar 23 at 23:31

























                  answered Mar 23 at 22:48









                  StumpedStumped

                  207




                  207

























                      0














                      Well, after a lot of different attempts at just entering SQL into Access, still missing something important:



                      Here are the Pieces so far (okay, so MAX appears to work despite documentation that said otherwise):



                      SELECT MAX(Table.Year) 
                      FROM Table
                      WHERE Table.Year<(SELECT MAX(Table.Year) FROM Table)


                      The above correctly selects the previous year (generally for Table).



                      The previous year for a particular client can be isolated thus:



                      SELECT Max(Table.Year) AS PreviousYear
                      FROM Table
                      WHERE (((Table.Year)<(SELECT MAX(Table.Year) FROM Table WHERE ((Table.ClientName)=[Client]))));


                      Where "Client" is, for now, just entered manually.



                      Now the challenge is to select the AppointmentDate value from the previous year's record by way of a common ClientName (and the above PreviousYear value for each ClientName - the PreviousYear values will be different for each Client) - this is where I seem to be missing something important:



                      SELECT Table.AppointmentDate
                      FROM Table
                      WHERE (((Table.ClientName=[Client])) AND ((Table.Year)=(SELECT MAX(Table.Year) AS LastDueDate FROM Table WHERE (((Table.Year)<(SELECT MAX(Table.Year) FROM Table WHERE ((Table.ClientName)=[Client]))))));


                      Not sure what's missing, tried: FROM Table t ...



                      Any insights would be appreciated - thanks!






                      share|improve this answer




























                        0














                        Well, after a lot of different attempts at just entering SQL into Access, still missing something important:



                        Here are the Pieces so far (okay, so MAX appears to work despite documentation that said otherwise):



                        SELECT MAX(Table.Year) 
                        FROM Table
                        WHERE Table.Year<(SELECT MAX(Table.Year) FROM Table)


                        The above correctly selects the previous year (generally for Table).



                        The previous year for a particular client can be isolated thus:



                        SELECT Max(Table.Year) AS PreviousYear
                        FROM Table
                        WHERE (((Table.Year)<(SELECT MAX(Table.Year) FROM Table WHERE ((Table.ClientName)=[Client]))));


                        Where "Client" is, for now, just entered manually.



                        Now the challenge is to select the AppointmentDate value from the previous year's record by way of a common ClientName (and the above PreviousYear value for each ClientName - the PreviousYear values will be different for each Client) - this is where I seem to be missing something important:



                        SELECT Table.AppointmentDate
                        FROM Table
                        WHERE (((Table.ClientName=[Client])) AND ((Table.Year)=(SELECT MAX(Table.Year) AS LastDueDate FROM Table WHERE (((Table.Year)<(SELECT MAX(Table.Year) FROM Table WHERE ((Table.ClientName)=[Client]))))));


                        Not sure what's missing, tried: FROM Table t ...



                        Any insights would be appreciated - thanks!






                        share|improve this answer


























                          0












                          0








                          0







                          Well, after a lot of different attempts at just entering SQL into Access, still missing something important:



                          Here are the Pieces so far (okay, so MAX appears to work despite documentation that said otherwise):



                          SELECT MAX(Table.Year) 
                          FROM Table
                          WHERE Table.Year<(SELECT MAX(Table.Year) FROM Table)


                          The above correctly selects the previous year (generally for Table).



                          The previous year for a particular client can be isolated thus:



                          SELECT Max(Table.Year) AS PreviousYear
                          FROM Table
                          WHERE (((Table.Year)<(SELECT MAX(Table.Year) FROM Table WHERE ((Table.ClientName)=[Client]))));


                          Where "Client" is, for now, just entered manually.



                          Now the challenge is to select the AppointmentDate value from the previous year's record by way of a common ClientName (and the above PreviousYear value for each ClientName - the PreviousYear values will be different for each Client) - this is where I seem to be missing something important:



                          SELECT Table.AppointmentDate
                          FROM Table
                          WHERE (((Table.ClientName=[Client])) AND ((Table.Year)=(SELECT MAX(Table.Year) AS LastDueDate FROM Table WHERE (((Table.Year)<(SELECT MAX(Table.Year) FROM Table WHERE ((Table.ClientName)=[Client]))))));


                          Not sure what's missing, tried: FROM Table t ...



                          Any insights would be appreciated - thanks!






                          share|improve this answer













                          Well, after a lot of different attempts at just entering SQL into Access, still missing something important:



                          Here are the Pieces so far (okay, so MAX appears to work despite documentation that said otherwise):



                          SELECT MAX(Table.Year) 
                          FROM Table
                          WHERE Table.Year<(SELECT MAX(Table.Year) FROM Table)


                          The above correctly selects the previous year (generally for Table).



                          The previous year for a particular client can be isolated thus:



                          SELECT Max(Table.Year) AS PreviousYear
                          FROM Table
                          WHERE (((Table.Year)<(SELECT MAX(Table.Year) FROM Table WHERE ((Table.ClientName)=[Client]))));


                          Where "Client" is, for now, just entered manually.



                          Now the challenge is to select the AppointmentDate value from the previous year's record by way of a common ClientName (and the above PreviousYear value for each ClientName - the PreviousYear values will be different for each Client) - this is where I seem to be missing something important:



                          SELECT Table.AppointmentDate
                          FROM Table
                          WHERE (((Table.ClientName=[Client])) AND ((Table.Year)=(SELECT MAX(Table.Year) AS LastDueDate FROM Table WHERE (((Table.Year)<(SELECT MAX(Table.Year) FROM Table WHERE ((Table.ClientName)=[Client]))))));


                          Not sure what's missing, tried: FROM Table t ...



                          Any insights would be appreciated - thanks!







                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Mar 23 at 22:24









                          StumpedStumped

                          207




                          207






























                              draft saved

                              draft discarded




















































                              Thanks for contributing an answer to Super User!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid



                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.


                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function () {
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsuperuser.com%2fquestions%2f1404667%2faccess-sql-subquery-to-find-a-value-from-the-previous-year-record-max-top-minus%23new-answer', 'question_page');
                              }
                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              Сан-Квентин

                              8-я гвардейская общевойсковая армия

                              Алькесар