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, ...) 

如果不是,代码将不起作用。

+0

是的,这就是我想要的。谢谢,我会在我有空时尝试一下你的代码。同时,你能向我解释什么是合并。我已经读过,但我没有得到它。 – Matt

+0

您好@CRAFTYDBA我已经尝试了您的建议,但出现以下错误:列'student.KS2Ma'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。 – Matt

+0

该模式是否有三列名为[ks2en],[ks2ma]和[ks2av]?这些必须是物理领域。 –