SQL:GROUP BY子句中的条件语句
问题描述:
当变量@SubjectName在“英语”,“数学”和任何其他科目(例如科学)之间更改时,我希望以下case语句更改结果集。SQL:GROUP BY子句中的条件语句
当变量为'英文'时,名为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 =“英语”的结果集看起来像:
Ks2
4b
4a
3c
No KS2
4c
4b
No KS2
5a
当@SubjectName = '数学' 的结果集的样子:
KS2
3c
4a
No KS2
2c
3a
4b
No KS2
3a
当@SubjectName =“科学”的结果集的样子:
KS2
3a
4a
3c
2c
4c
4b
No KS2
4a
答
此代码将动态返回根据主题三列之一。
这就是你想要的吗?如果需要,您可以在声明结尾的地方添加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, ...)
如果不是,代码将不起作用。
是的,这就是我想要的。谢谢,我会在我有空时尝试一下你的代码。同时,你能向我解释什么是合并。我已经读过,但我没有得到它。 – Matt
您好@CRAFTYDBA我已经尝试了您的建议,但出现以下错误:列'student.KS2Ma'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。 – Matt
该模式是否有三列名为[ks2en],[ks2ma]和[ks2av]?这些必须是物理领域。 –