sas - 在 PROC SQL 中将表连接在一起
问题描述
我想将我创建的两个表连接到一个表中,但我收到一个语法错误,提示在同一范围内的多个表中找到 ColumnOverallStudentReport.ID。如果有人可以帮助解决这个语法错误,那将不胜感激,或者如果有人有更好的方法将这两个表连接在一起,这也会有所帮助。下面的代码创建了我的第一个表
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;
下面的代码创建了我的第二个表
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;
下面的代码应该加入上面创建的两个表,但存在语法错误。
PROC SQL;
Create table Report1 as select *
from SemesterReport1, OverallStudentReport
full join
OverallStudentReport
on SemesterReport1.ID=OverallStudentReport.ID
order by ID
;
quit;
这是我的日志
1 OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;
72
73 处理 SQL;
74 创建表 Report1 作为选择 *
75 来自 SemesterReport1,OverallStudentReport
76 完全加入
77 总体学生报告
78 在 SemesterReport1.ID=OverallStudentReport.ID
79按ID订购
80;
错误:在同一范围内的多个表中找到列OverallStudentReport.ID。
警告:名为 ID 的列在选择表达式(或视图)中重复。对它的明确引用将是第一个。
注意:PROC SQL 设置选项 NOEXEC 并将继续检查语句的语法。
81 退出;
注意:SAS 系统因错误而停止处理此步骤。
注意:使用的 PROCEDURE SQL(总处理时间):
解决方案
当您分配表别名时,您应该在整个查询中始终如一地使用它们,而不仅仅是在SELECT
和中选择性地使用它们JOIN
。此外,字段 inORDER BY
是模棱两可的。由于您需要计算列 in SELECT
usecalculated
关键字。
顺便说一句,请参阅要踢的坏习惯:使用表别名,如 (a, b, c) 或 (t1, t2, t3)。相反,请使用与原始表名对齐的更多信息速记别名。考虑以下调整:
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;
然后在最终查询中,不要重复 table OverallStudentReport
。你应该限定ID
(这里是Final_ID
) in order by
。并看到另一个要改掉的习惯:为什么 SELECT * 被认为是有害的?
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;
推荐阅读
- google-cloud-platform - 一个 IP 的 GCP API 阈值
- java - 为什么全局对象数组进入方法时突然为空?
- c# - ASP.NET Core MVC 在回发时检查授权
- c++ - 我试图像输出一样显示全名,但是每当我点击进入程序时,只打印出 1 个单词而不是 2 个单词
- algorithm - 将x数量的人分成n个不同大小的房间的算法
- laravel - Laravel Echo/Pusher/Vue - /broadcasting/auth 返回空的 HTML 响应
- javascript - 如何在不使用脚本标签的情况下包含外部 javascript 文件
- firebase - getter 'documents' 在 null 上被调用了一段时间
- excel - VBA 不断在我的公式中添加一个幽灵@。一旦我手动删除它,公式就会正常工作。我该如何防止这种情况?
- javascript - JavaScript 异步函数是否总是传入消息队列?