【问题标题】:SQL select value if condition in same table is met如果满足同一张表中的条件,则 SQL 选择值
【发布时间】:2020-12-29 16:55:59
【问题描述】:

我希望在存在值时从表中获取值,否则使用 NULL(或占位符)代替。 我该怎么做?

表格如下所示:

学生 |身份证 |名字 |姓氏 | |----|------------|----------| | 1 |约翰 |能源部 | | 2 |简 |霜 | | 3 |抢 |史密斯 | 学习年 |身份证 |开始日期 |结束日期 |当前年份| |----|-------------------------|------ -------|-----------| | 1 | 2018-09-01 00:00:00.000 | 2019-08-31 00:00:00.000 |第一年 | | 1 | 2019-09-01 00:00:00.000 | 2020-08-31 00:00:00.000 |第二年 | | 1 | 2020-09-01 00:00:00.000 | 2021-08-31 00:00:00.000 |第 3 年 | | 3 | 2020-09-01 00:00:00.000 | 2021-08-31 00:00:00.000 |第一年 |

我想要的结果是这样的:

|身份证 |名字 |姓氏|当前年份| |----|------------|----------|------------| | 1 |约翰 |能源部 |第 3 年 | | 2 |简 |霜 |空 | | 3 |抢 |史密斯 |第一年 | | | | | |

我用 CASE 尝试了几件事:

(
    CASE
        WHEN (
            YEAR(StudyYear.CurrentYear) = '2020'
        ) THEN (SELECT StudyYear WHERE YEAR(StudyYear.CurrentYear) = '2020')
        ELSE (NULL)
    END
) AS CurrentYear

但这会过滤掉未出现在 studyyear 表中的条目。 不做一个案例也会返回另一个表的所有结果。

【问题讨论】:

    标签: sql sql-server join case


    【解决方案1】:

    使用子查询并加入

    select a.id,a.firstname,a.lastname,CurrentYear
     from students a left join
    (
    select *,row_number()(over partition by id order by EndDate desc)
    rn from studyyear
    ) b on a.id=b.id
     where a.rn=1
    

    【讨论】:

      【解决方案2】:

      使用外部应用

      SELECT 
       S.*, O.CurrentYear 
      
      FROM Students S
      OUTER APPLY 
      ( 
      SELECT CurrentYear FOM StudyYear SY
      WHERE SY.ID=S.ID AND
      YEAR(StartDate)=2020
      )O
      

      【讨论】:

      • 这正是我想要的。谢谢!
      【解决方案3】:

      你可以试试下面的-

      select id, Firstname,Lastname,currentyear
      from Students s left join StudyYear s1
      on s.id=s1.id and YEAR(startdate)=2020 and year(enddate)>=2020
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-13
        • 2022-11-25
        • 1970-01-01
        • 2020-08-18
        • 2011-10-16
        • 1970-01-01
        • 1970-01-01
        • 2022-01-02
        相关资源
        最近更新 更多