使用子查询添加具有不同 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 子句获取聚合的子查询

为啥在具有多个连接的 WHERE 子句中,子查询比文字值执行得更好?

如何合并具有不同 WHERE 子句的两个 SELECT 查询

深入理解CQL中的Where子句

多表查询