在 PROC SQL 中连接表

Joining Together Tables in PROC SQL

我想将我创建的两个 table 合并为一个 table,但我收到一个语法错误,指出在多个 [=62] 中找到列 OverallStudentReport.ID =] 在同一范围内。如果有人可以帮助修复此语法错误,我们将不胜感激,或者如果有人有更好的方法将这两个 table 连接成一个,这也会有所帮助。 下面的代码创建了我的第一个 table

 PROC SQL;
Create table SemesterReport1 as select coalesce(A.ID,B.ID,C.ID,D.ID,E.ID) as ID, 
    coalesce(A.Year,B.Year,C.Year,D.Year,E.Year) as Year, coalesce(A.Term,B.Term,C.Term,D.Term,E.Term) as Term, 
    SemesterGPA.SemGPA, AccumulativeGPA.GPAAccum, 
    CreditHoursEarnedSemester.CreditHoursEarnedSemester, 
    GradedCreditHoursEarnedSemester.GradedCreditHoursEarnedSemester, 
    ClassStanding.ClassStanding 
    from SemesterGPA as A 
    full join AccumulativeGPA as B on A.ID=B.ID and A.Year=B.Year and A.Term=B.Term
    full join CreditHoursEarnedSemester as C on A.ID=C.ID and A.Year=C.Year and A.Term=C.Term
    full join GradedCreditHoursEarnedSemester as D on A.ID=D.ID and A.Year=D.Year and A.Term=D.Term
    full join ClassStanding as E on A.ID=E.ID and A.Year=E.Year and A.Term=E.Term
    order by ID, Year, Term
;
quit;

下面的代码创建了我的第二个 table

PROC SQL;
Create table OverallStudentReport as select coalesce(A.ID,B.ID,C.ID,D.ID,E.ID) as ID, 
OverallGPA.TotalGPA,
OverallCreditHoursEarned.OverallCreditHoursEarned,
OverallGradedCreditHoursEarned.OverallGradedCreditHoursEarned,
RepeatClasses.RepeatClasses,
GradeCounts.ACount,GradeCounts.BCount,GradeCounts.CCount,GradeCounts.DCount,
GradeCounts.ECount, GradeCounts.WCount
from OverallGPA as A
full join OverallCreditHoursEarned as B on A.ID=B.ID
full join OverallGradedCreditHoursEarned as C on A.ID=C.ID
full join RepeatClasses as D on A.ID=D.ID
full join GradeCounts as E on A.ID=E.ID
order by ID
;
quit;

下面的代码应该加入上面创建的两个 table,但存在语法错误。

PROC SQL;
Create table Report1 as select *
from SemesterReport1, OverallStudentReport
full join
OverallStudentReport
on SemesterReport1.ID=OverallStudentReport.ID
order by ID
;
quit;

这是我的日志

1 选项 NONOTES NOSTIME NOSOURCE NOSYNTAXCHECK;

72
73 过程SQL;

74 创建 table Report1 为 select *

75 来自 SemesterReport1,OverallStudentReport

76人全加入

77 总体学生报告

78 SemesterReport1.ID=OverallStudentReport.ID

79 按 ID 订购

80 ;

错误:在同一范围内的多个 table 中找到列 OverallStudentReport.ID。

警告:名为 ID 的列在 select 表达式(或视图)中重复。对它的显式引用将是第一个。

注意:PROC SQL 设置选项 NOEXEC 并将继续检查语句的语法。

81 退出;

注意:SAS 系统因错误停止处理此步骤。

注意:使用的程序 SQL(总处理时间):

当您分配 table 别名时,您应该在整个查询中始终如一地使用它们,而不仅仅是在 SELECTJOIN 中有选择地使用它们。此外,ORDER BY 中的字段不明确。由于您需要 SELECT 中的计算列,因此请使用 calculated 关键字。

顺便看看Bad Habits to Kick : Using table aliases like (a, b, c) or (t1, t2, t3)。相反,使用与原始 table 名称对齐的更多信息 shorthand 别名。考虑以下调整:

PROC SQL;
    create table SemesterReport1 as 
    select coalesce(s.ID, a.ID, ch.ID, g.ID, cs.ID) as Final_ID 
         , coalesce(s.Year, a.Year, ch.Year, g.Year, cs.Year) as Final_Year 
         , coalesce(s.Term, a.Term, ch.Term, g.Term, cs.Term) as Final_Term
         , s.SemGPA
         , a.GPAAccum
         , ch.CreditHoursEarnedSemester
         , g.GradedCreditHoursEarnedSemester
         , cs.ClassStanding 
    from SemesterGPA as s
    full join AccumulativeGPA as a
       on s.ID = a.ID 
       and s.Year = a.Year 
       and s.Term = a.Term
    full join CreditHoursEarnedSemester as ch
       on s.ID = ch.ID 
       and s.Year = ch.Year 
       and s.Term = ch.Term
    full join GradedCreditHoursEarnedSemester as g 
       on s.ID = g.ID 
       and s.Year = g.Year 
       and s.Term = g.Term
    full join ClassStanding as cs 
       on s.ID = cs.ID  
       and s.Year = cs.Year 
       and s.Term = cs.Term
    order by calculated Final_ID
           , calculated Final_Year
           , calculated Final_Term;
quit;
PROC SQL;
    create table OverallStudentReport as 
    select coalesce(og.ID, och.ID, ogch.ID, r.ID, gc.ID) as Final_ID
         , og.TotalGPA
         , och.OverallCreditHoursEarned
         , ogch.OverallGradedCreditHoursEarned
         , r.RepeatClasses
         , gc.ACount
         , gc.BCount
         , gc.CCount
         , gc.DCount
         , gc.ECount
         , gc.WCount
    from OverallGPA as og
    full join OverallCreditHoursEarned as och 
       on og.ID = och.ID
    full join OverallGradedCreditHoursEarned as ogch 
       on og.ID = ogch.ID
    full join RepeatClasses as r 
       on og.ID = r.ID
    full join GradeCounts as gc 
       on og.ID = gc.ID
    order by calculated Final_ID;
quit;

那么在最后的查询中,不要重复tableOverallStudentReport。并且您应该在 order by 中限定 ID(此处为 Final_ID)。看看另一个习惯:Why is SELECT * considered harmful?

PROC SQL; 
    create table Report1 as 
    select smr.Final_ID as ID
         , smr.Final_Year as Year
         , smr.Final_Term as Term
         , smr.SemGPA 
         , smr.GPAAccum 
         , smr.CreditHoursEarnedSemester
         , smr.GradedCreditHoursEarnedSemester
         , smr.ClassStanding 
         , osr.Final_ID 
         , osr.TotalGPA
         , osr.OverallCreditHoursEarned
         , osr.OverallGradedCreditHoursEarned 
         , osr.RepeatClasses 
         , osr.ACount 
         , osr.BCount
         , osr.CCount 
         , osr.DCount 
         , osr.ECount 
         , osr.WCount
    from SemesterReport1 smr
    full join OverallStudentReport osr
       on smr.Final_ID = osr.Final_ID 
    order by smr.Final_ID ; 
quit;