早上好,
不可否认,在SQL查询方面,我还是个新手。。。话虽如此,我的技术正在进步!
我有一个学生人口统计查询,也需要填写";"学习模式";的首选项具体日期范围。
在2020年疫情期间,我们学校正在使用混合模式。学生可以是面对面的、混合的或远程的。我正在加入一个跟踪该偏好的表格。挑战在于学生的身份可能会改变。例如,学生可以在年初开始混合动力,家长可以选择将他们转移到远程。当这种情况发生时,会在表中放入一个新条目。我需要能够通过特定的月份或日期范围来显示学生的学习偏好。
以下是学生学习偏好表的查询示例:
SELECT SLP.STUDENTSDCID, DECODE (SLP.LEARNINGPREFERENCE,01,'in-person',02,'Hybrid',03,'Remote') AS LEARNINGPREFERENCE,
TO_CHAR(SLP.EFFECTIVEDATE,'MM/DD/YYYY') AS EFFECTIVEDATE
FROM S_STU_LEARNINGPREF_C SLP
ORDER BY SLP.STUDENTSDCID
学生ID | 首选项 | 日期|
---|---|---|
3432 | 混合动力 | 2020年9月16日|
3506 | 混合 | 2020年9月16日|
3541 | 混合 | 2020年9月16日|
3563 | 亲自 | 2020年9月17日 |
3563 | 混合 | 2020年9月16日 |
3588 | 混合动力 | 2020年9月16日
最明显的解决方案是创建一个包含首选项的表,例如
create table preference as
select '01' pref_id, 'in-person' name from dual union all
select '02' , 'hybrid' from dual union all
select '03' , 'remote' from dual;
并将其与您的其他查询结合起来:
select
s.studentsdcid,
p.name learningpreference,
to_char(s.effectivedate, 'mm/dd/yyyy') effectivedate
from s_stu_learningpref_c s join preference p on p.id = s.learningpreference
order by s.studentsdcid;
否则,如果你不能创建一个表(尽管,我看不出你为什么不创建(,你可以使用子查询或CTE(通用表表达式,也称为WITH因子分解子句(,例如
with preference (pref_id, name) as
(select '01' pref_id, 'in-person' name from dual union all
select '02' , 'hybrid' from dual union all
select '03' , 'remote' from dual
)
select
s.studentsdcid,
p.name learningpreference,
to_char(s.effectivedate, 'mm/dd/yyyy') effectivedate
from s_stu_learningpref_c s join preference p on p.id = s.learningpreference
order by s.studentsdcid;
每个学生都会有偏好吗?如果是,则可以使用CTE或子查询的联接来获取最大首选项日期。
例如
SELECT S.STUDENT_NUMBER, S.STATE_STUDENTNUMBER AS SASID, NVL(SCF.PSCORE_LEGAL_FIRST_NAME,S.FIRST_NAME) AS FNAME,
NVL(SCF.PSCORE_LEGAL_MIDDLE_NAME,S.MIDDLE_NAME) AS MNAME, NVL(SCF.PSCORE_LEGAL_LAST_NAME,S.LAST_NAME) AS LNAME,
TO_CHAR(S.DOB,'MM/DD/YYYY') AS DOB, '' AS FREE_REDUCED_IND,
NVL(NVL(LTRIM(regexp_substr(S.MOTHER, '[^,]+', 1, 2)),LTRIM(regexp_substr(S.FATHER, '[^,]+', 1, 2))),SCF.GUARDIAN_FN) AS PRIMARY_CONTACT_FNAME,
NVL(NVL(LTRIM(regexp_substr(S.MOTHER, '[^,]+', 1, 1)),LTRIM(regexp_substr(S.FATHER, '[^,]+', 1, 1))),SCF.GUARDIAN_LN) AS PRIMARY_CONTACT_LNAME,
regexp_substr(S.MAILING_STREET, '[^,]+', 1, 1) AS STU_STREET_ADDR_1, regexp_substr(S.MAILING_STREET, '[^,]+', 1, 2) AS STU_STREET_ADDR_2,
S.MAILING_CITY AS STU_STREET_CITY, S.MAILING_ZIP AS STU_STREET_ZIP, '0'||S.SCHOOLID AS SCHOOL_ID,
DECODE(S.SCHOOLID,1690005,'0169',1730005,'0173',1730010,'0173',2500005,'0250',7400405,'0740',7400505,'0740') AS DISTRICT_CODE,'' AS OCT_MODE, '' AS NOV_MODE
DECODE (SLP.LEARNINGPREFERENCE,01,'in-person',02,'Hybrid',03,'Remote') AS "LEARNINGPREFERENCE", TO_CHAR(SLP.EFFECTIVEDATE,'MM/DD/YYYY') AS EFFECTIVE_DATE
FROM STUDENTS S
LEFT JOIN STUDENTCOREFIELDS SCF ON S.dcid = SCF.studentsdcid
LEFT JOIN S_STU_LEARNINGPREF_C SLP ON S.dcid = SLP.studentsdcid
JOIN (Select studentsdcid, max(EFFECTIVEDATE) lastDate from S_STU_LEARNINGPREF_C group by studentsdcid) lastPref ON SLP.studentsdcid = lastPref.studentsdcid and SLP.EFFECTIVEDATE = lastPref.lastDate
WHERE S.ENROLL_STATUS = '0'
ORDER BY S.LAST_NAME, S.FIRST_NAME