Hi...I can't seem to correct why I am receiving an error message.....I am wondering if anyone can see where the error is. Thanks.
%LET StartDate = '2013-01-01 00:00:00.000'; %LET EndDate = '2017-12-31 23:59:59.999'; proc sql noprint; create table new as SELECT DISTINCT S.StudentID, S.LastName, S.FirstName, SP.MajorDegree, SS.RegisterStatus, S.DateEntered AS 'Matriculation Date'n, S.WithdrawnDate, (SELECT AdmissionDate FROM SQLDB.StudentDegree WHERE (StudentUID = S.StudentUID AND MajorID1 = SP.MajorDegreeID) ORDER BY GraduationDate DESC) AS AdmissionDate, (SELECT GraduationDate FROM SQLDB.StudentDegree WHERE (StudentUID = S.StudentUID AND MajorID1 = SP.MajorDegreeID) ORDER BY GraduationDate DESC) AS GraduationDate, SS.EnrollmentStatus FROM SQLDB.CAMS_StudentStatus_View SS INNER JOIN SQLDB.CAMS_Student_View S ON S.StudentUID = SS.StudentUID INNER JOIN SQLDB.CAMS_StudentProgram_View SP ON SP.StudentStatusID = SS.StudentStatusID INNER JOIN SQLDB.Programs PG ON S.ProgramsID = PG.ProgramsID WHERE S.DateEntered BETWEEN &StartDate AND &EndDate AND SP.MajorDegree ^= '' ORDER BY S.DateEntered, S.StudentID ASC; quit; Log output: 8 GOPTIONS ACCESSIBLE; 39 40 %LET StartDate = '2013-01-01 00:00:00.000'; 41 %LET EndDate = '2017-12-31 23:59:59.999'; 42 43 44 proc sql noprint; 45 create table new as 46 SELECT DISTINCT 47 S.StudentID, 48 S.LastName, 49 S.FirstName, 50 SP.MajorDegree, 51 SS.RegisterStatus, 52 S.DateEntered AS 'Matriculation Date'n, 53 S.WithdrawnDate, 54 (SELECT AdmissionDate FROM SQLDB.StudentDegree 2 The SAS System 12:53 Thursday, October 5, 2017 55 WHERE (StudentUID = S.StudentUID 56 AND MajorID1 = SP.MajorDegreeID) 57 ORDER BY GraduationDate DESC) AS AdmissionDate, _____ 22 76 ERROR 22-322: Syntax error, expecting one of the following: !, !!, &, ), *, **, +, -, /, <, <=, <>, =, >, >=, ?, AND, BETWEEN, CONTAINS, EQ, EQT, EXCEPT, GE, GET, GROUP, GT, GTT, HAVING, IN, INTERSECT, IS, LE, LET, LIKE, LT, LTT, NE, NET, NOT, NOTIN, OR, OUTER, UNION, ^, ^=, |, ||, ~, ~=. ERROR 76-322: Syntax error, statement will be ignored. 58 (SELECT GraduationDate FROM SQLDB.StudentDegree 59 WHERE (StudentUID = S.StudentUID 60 AND MajorID1 = SP.MajorDegreeID) 61 ORDER BY GraduationDate DESC) AS GraduationDate, 62 SS.EnrollmentStatus 63 FROM SQLDB.CAMS_StudentStatus_View SS 64 INNER JOIN SQLDB.CAMS_Student_View S ON S.StudentUID = SS.StudentUID 65 INNER JOIN SQLDB.CAMS_StudentProgram_View SP ON SP.StudentStatusID = SS.StudentStatusID 66 INNER JOIN SQLDB.Programs PG ON S.ProgramsID = PG.ProgramsID 67 WHERE S.DateEntered BETWEEN &StartDate AND &EndDate 68 AND SP.MajorDegree ^= '' 69 ORDER BY S.DateEntered, S.StudentID ASC; NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements. 70 quit;
Hi.....
Have you verified that the subquery
(SELECT AdmissionDate FROM SQLDB.StudentDegree55
WHERE (StudentUID = S.StudentUID
AND MajorID1 = SP.MajorDegreeID)
ORDER BY GraduationDate DESC)
returns only a single value?
I believe the requirement for a subquery as a part of the select statement can return only a single value.
ORDER BY on subqueries don't make sense, I would start by removing them.
Have you verified that the subquery
(SELECT AdmissionDate FROM SQLDB.StudentDegree55
WHERE (StudentUID = S.StudentUID
AND MajorID1 = SP.MajorDegreeID)
ORDER BY GraduationDate DESC)
returns only a single value?
I believe the requirement for a subquery as a part of the select statement can return only a single value.
Hi Ballardw.....thank you for suggestion....I did remove the order by in the sub query with the select statement and receive a different error message which most likely was due to not being able to return a single value. I ended up breaking the queries into separate proc sql procedures and then joining the query results together. Thanks once again....greatly appreciated your help.
I'm not saying there is anything wrong with your other responses, but I believe error message is caused by the way you assign a value to the macrovars, and the way you use them later.
You have
%let startdate='2013-01-01 00:00:00.000';
%let enddate='2017-12-31 23:59:59:999';
Later on you have the expression
WHERE S.DateEntered BETWEEN &StartDate AND &EndDate
if DateEntered is a character variable, then ignore my comments. But if DateEntered is a sas datetime variables, then use this:
%LET StartDate = 2013-01-01 00:00:00.000;
%LET EndDate = 2017-12-31 23:59:59.999;
proc sql ...
WHERE S.DateEntered BETWEEN "&StartDate"dt AND "&EndDate"dt
...
This approach allows you to properly use macrovars to specify a datetime literal.
I think order by will not work in the nested Select statements. Try removing it and run.
also you may need to make sure the sub query doesn't return more than one records, guess it wont give you errors but it may get you unexpected results
Hi Mkeintz.....thanks for your suggestion and explanation....it worked.
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.