使用子查询添加具有不同 where 子句的列
Posted
技术标签:
【中文标题】使用子查询添加具有不同 where 子句的列【英文标题】:Adding on a column with different where clauses using a subquery 【发布时间】:2019-05-02 18:10:58 【问题描述】:我有一个从当年提取数据的查询,我正在尝试使用子查询在上一年的新列中添加数据,因为主查询的 WHERE 语句将其限制为当前年份。我不断收到子查询返回超过 1 个值的错误,但是当我只运行子查询时,每个 ID 只有一个值。我以前分别运行这两个查询并在 Excel 中使用 vlookup 来加入最后一列,但我希望有一种方法可以在一个查询中执行此操作。
SELECT DISTINCT student_master.id_num, stud_term_sum_div_a.trm_gpa,
(SELECT stud_term_sum_div_b.trm_gpa
FROM student_master LEFT OUTER JOIN
stud_term_sum_div stud_term_sum_div_b
ON student_master.id_num = stud_term_sum_div_b.id_num
WHERE ( stud_term_sum_div_b.yr_cde = '2018'
) A AS Prev_GPA
FROM student_master LEFT OUTER JOIN
stud_term_sum_div stud_term_sum_div_a
ON student_master.id_num = stud_term_sum_div_a.id_num
WHERE stud_term_sum_div_a..yr_cde = '2019'
我希望有 3 列 - 学生 ID、2019 年 gpa、2018 年 gpa
【问题讨论】:
更改您的日期范围以包括两个年份,然后使用CASE
语句确定哪些年份的数据进入哪一列。
【参考方案1】:
要获得您在问题中提到的具体年份,您可以使用 Case 语句执行以下操作:
SELECT DISTINCT student_master.id_num,
Case when stud_term_sum_div.yr_cde = '2018' then stud_term_sum_div.trm_gpa end as '2018 GPA',
Case when stud_term_sum_div.yr_cde = '2019' then stud_term_sum_div.trm_gpa end as '2019 GPA'
FROM student_master LEFT OUTER JOIN
stud_term_sum_div
ON student_master.id_num = stud_term_sum_div.id_num
WHERE stud_term_sum_div.yr_cde in ('2018','2019')
在不使用特定日期的情况下获取今年和去年:
SELECT DISTINCT student_master.id_num,
Case when CAST(stud_term_sum_div.yr_cde as int) = year(getdate())-1 then stud_term_sum_div.trm_gpa end as 'Last GPA',
Case when CAST(stud_term_sum_div.yr_cde as int) = year(getdate()) then stud_term_sum_div.trm_gpa end as 'Current GPA'
FROM student_master LEFT OUTER JOIN
stud_term_sum_div
ON student_master.id_num = stud_term_sum_div.id_num
WHERE CAST(stud_term_sum_div.yr_cde as int) >= year(getdate())-1
【讨论】:
以上是关于使用子查询添加具有不同 where 子句的列的主要内容,如果未能解决你的问题,请参考以下文章
数据库子查询 ---where或having后面----列子查询-多行子查询
为啥在具有多个连接的 WHERE 子句中,子查询比文字值执行得更好?