根据条件声明变量

Posted

技术标签:

【中文标题】根据条件声明变量【英文标题】:Declare Variable based on conditions 【发布时间】:2017-05-22 14:22:40 【问题描述】:

我想在下面声明一个变量@Grade:

Declare @Grade varchar(max)''
Select @Grade = ...

连接表需要满足以下条件:

如果 table1 subjectid 存在于 tableA id 中,则为每个 studentid 从 tableA 中选择 @Grade

如果 table1 subjectid 存在于 tableB id 中,则为每个 studentid 从 tableB 中选择 @Grade

如果tableC id中存在table1 subjectid,则为每个studentid从tableC中选择@Grade

Sample Table1 - Student
Student ID   Subject ID   Rating
100          200          A
101          200          B
102          300          A
103          400          B
104
105          300          A

Sample TableA - Chinese
Subject ID  Rating      Grade
200         A           Good
200         B           Poor

Sample TableB - English
Subject ID  Rating       Grade
300         A            Good
300         B            Poor

Sample TableC - Maths
Subject ID  Rating       Grade
400         A            Good
400         B            Poor

Expected output:
Student ID   Subject ID   @Grade
100          200          Good
101          200          Poor
102          300          Good
103          400          Poor
104
105          300          Good

有人可以帮我解决这个问题吗?

【问题讨论】:

什么 rdbms? table1 id 是什么? 请查看更新后的表格,谢谢 不。不知道您要在这里做什么。我猜这里的表 1、A、B 和 C 是您的样本数据?如果有,对应的预期结果是什么? 基本上,目标是如果主表 1 中的科目 ID 存在于表 A 或 B 或 C 中,则为每个科目的每个学生 ID 从表 A 或 B 或 C 中选择相应的等级.而 Grade 实际上是一个要声明的变量... 【参考方案1】:

这似乎产生了你预期的结果:

declare @Student table (StudentID int not null,SubjectID int null,Rating char(1) null)
insert into @Student(StudentID,SubjectID,Rating) values
(100,200 ,'A'),    (101,200 ,'B'),    (102,300 ,'A'),
(103,400 ,'B'),    (104,null,null),    (105,300 ,'A')

declare @Chinese table (SubjectID int not null,Rating char(1) not null,Grade varchar(17) not null)
insert into @Chinese(SubjectID,Rating,Grade) values
(200,'A','Good'),    (200,'B','Poor')

declare @English table (SubjectID int not null,Rating char(1) not null,Grade varchar(17) not null)
insert into @English(SubjectID,Rating,Grade) values
(300,'A','Good'),    (300,'B','Poor')

declare @Maths table (SubjectID int not null,Rating char(1) not null,Grade varchar(17) not null)
insert into @Maths(SubjectID,Rating,Grade) values
(400,'A','Good'),    (400,'B','Poor')

select
    s.StudentID,
    s.SubjectID,
    COALESCE(c.Grade,e.Grade,m.Grade) as Grade
from
    @Student s
        left join
    @Chinese c
        on
            s.SubjectID = c.SubjectID and s.Rating = c.Rating
        left join
    @English e
        on
            s.SubjectID = e.SubjectID and s.Rating = e.Rating
        left join
    @Maths m
        on
            s.SubjectID = m.SubjectID and s.Rating = m.Rating

结果:

StudentID   SubjectID   Grade
----------- ----------- -----------------
100         200         Good
101         200         Poor
102         300         Good
103         400         Poor
104         NULL        NULL
105         300         Good

请注意,尽管您当前的表格设计在这里对我们没有帮助 - 我不清楚为什么我们有三个单独的表格用于主题标记方案 - 所有数据看起来都可以出现在一个表格中,这将大大简化上面的查询。

【讨论】:

感谢您的帮助!的确,中文、英文和数学表只是示例表,有助于在这里更容易地表达我的问题,实际情况这些表实际上是三个单独的表来存储信息...... 您好 Damien,我遇到错误:无法绑定多部分标识符“c.Grade,e.Grade,m.Grade”。 SQL如何识别“s.”、“e.”和“米”。作为三个声明的变量表?

以上是关于根据条件声明变量的主要内容,如果未能解决你的问题,请参考以下文章

声明的表变量上的动态 Select 语句 - SYBASE

根据 sys.tables 中的名称声明一个变量,然后在动态 SQL 中根据该变量删除表

条件变量模式-让线程根据条件执行

XSLT:根据条件设置多个变量

SqlServer问题收集必须声明标量变量

根据变量声明,下列各赋值语句中存放的结果是声明?