2013-09-30 135 views
0

當變量@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 

回答

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

如果不是,代碼將不起作用。

+0

是的,這就是我想要的。謝謝,我會在我有空時嘗試一下你的代碼。同時,你能向我解釋什麼是合併。我已經讀過,但我沒有得到它。 – Matt

+0

您好@CRAFTYDBA我已經嘗試了您的建議,但出現以下錯誤:列'student.KS2Ma'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。 – Matt

+0

該模式是否有三列名爲[ks2en],[ks2ma]和[ks2av]?這些必須是物理領域。 –