我希望以下case语句在“英语”,“数学”和任何其他主题(例如科学)之间更改变量@SubjectName时更改结果集。
当变量为“英语”时,学生名为Ks2en的列应包含在结果集中,但是当选择“数学”时,该列将更改为Ks2ma,当它为任何其他内容时,应选择Ks2av。
如果结果集中有任何空白值(''),则将其替换为'No KS2'。
这是我到目前为止所做的不起作用:
@SubjectName varchar(100) ='English'
SELECT CASE WHEN (student.Ks2en = '' and @SubjectName = 'English') OR
(student.Ks2ma = '' and @SubjectName = 'Mathematics') OR
(student.Ks2ma = '' AND @SubjectName <> 'Mathematics' AND
@SubjectName <> 'English')
THEN 'No KS2' ELSE student.ks2en
OR student.Ks2ma OR student.Ks2av END AS 'KS2'
FROM student JOIN subject
ON subject.upn=student.upn
WHERE
[subject.Name] = @SubjectName
以下是学生表的示例:
Ks2en Ks2ma Ks2av
4b 3c 3a
4a 4a 4a
3c 3c
2c 2c
4c 3a 4c
4b 4b 4b
5a 3a 4a
因此,当@SubjectName ='English'时,结果集如下所示:
Ks2
4b
4a
3c
No KS2
4c
4b
No KS2
5a
当@SubjectName ='Mathematics'时,结果集如下所示:
KS2
3c
4a
No KS2
2c
3a
4b
No KS2
3a
当@SubjectName ='Science'时,结果集如下所示:
KS2
3a
4a
3c
2c
4c
4b
No KS2
4a
答案 0 :(得分:1)
此代码将根据主题动态返回三列中的一列。
这就是你想要的吗?如果需要,您可以在语句末尾的where子句中添加。
约翰
-- dynamically create column
SELECT
CASE
WHEN lower(coalesce(SubjectName, 'unknown')) = 'english' THEN
[Ks2en]
WHEN lower(coalesce(SubjectName, 'unknown')) = 'mathematics' THEN
[Ks2ma]
ELSE
[Ks2av]
END as KS2
FROM [student] INNER JOIN [subject] ON subject.upn=student.upn
WHERE [subject].Subjectname LIKE @SubjectName;
我假设您的表架构如下所示。我正在使用元组符号。
student (upn, student name, ...)
subject (upn, subject name, ks2en, ks2ma, ks2av, ...)
如果不是,代码将无效。