これは、SELECT ステートメントに case ステートメントがあり、これに対して GROUP BY および ORDER BY ステートメントを実行しようとしているという事実と関係があると思われます。
2 つのテーブル間の結合に基づく結果セットがあります。1 つは、値 2c、2b、2a、3c、3b などを持つ ks2en、ks2ma、および Ks2av 列を持つ生徒のテーブルです。2 番目は、A+、A、A-、B+ などの各生徒の結果のテーブルです。 ks2en、ks2ma、および Ks2av 列がグループ化され、結果が合計され、左下にレベル、上に結果の合計のグリッドが表示されます。ただし、Ks2en、Ks2ma、および Ks2av の 3 種類のレベルは、特定の主題に基づいて結果をもたらす必要があります。
Ks2en - English Result
Ks2ma - Maths Result
Ks2av - Any other subject Result
ks2en、ks2ma、または ks2av 列に値がない場合、group by を「No KS2」と表示したいと思います。
下部にある私のコードは、Ks2en に対して英語で非常にうまく機能しますが、Subject が英語、数学、またはその他のいずれであるかに基づいて結果を変更するロジックを考え出すのに苦労しています。
サブジェクトは、@SubjectName という変数を介して入力されます。
以下は、SQLで実行したいことの擬似コードです。
If @SubjectName = 'English' then
If ks2en ='' then
display 'No KS2'
else Ks2en
endif
Else if @SubjectName = 'Mathematics' then
If ks2ma ='' then
display 'No KS2'
else Ks2ma
endif
Else if @SubjectName <> 'English' and @SubjectName <> 'Mathematics' then
If ks2av ='' then
display 'No KS2'
else Ks2av
endif
@SubjectName = 'English' の場合に動作するこれまでのコードは次のとおりです。
DECLARE
@DataCollection varchar(50) = '2013/14 - Autumn 1 - Targets',
@StuYear VARCHAR(2) = '11',
@SubjectName varchar(100) ='English',
@TeachingGroup varchar(25) = 'Select All',
@SubGroup varchar(10) = 'Select All'
SELECT CASE WHEN Ks2en = '' and @SubjectName = 'English' THEN 'No KS2' ELSE ks2en END AS 'KS2',
nullif(count(CASE WHEN result = '' THEN 1 END),0) AS 'No Level/Grade',
nullif(count(CASE WHEN result IN ('U', '1a', '1b', '1c') THEN 1 END),0) AS '1/U',
nullif(count(CASE WHEN result IN ('U', '2a', '2b', '2c') THEN 1 END),0) AS '2/U',
nullif(count(CASE WHEN result IN ('G-','3c') THEN 1 END),0) AS '3c/G-',
nullif(count(CASE WHEN result IN ('G', '3b') THEN 1 END),0) AS '3b/G',
nullif(count(CASE WHEN result IN ('G+','3a') THEN 1 END),0) AS '3a/G+',
nullif(count(CASE WHEN result IN( 'F-','4c') THEN 1 END),0) AS '4c/F-',
nullif(count(CASE WHEN result IN( 'F', '4b') THEN 1 END),0) AS '4b/F',
nullif(count(CASE WHEN result IN( 'F+', '4a') THEN 1 END),0) AS '4a/F+',
nullif(count(CASE WHEN result IN( 'E-', '5c') THEN 1 END),0) AS '5c/E-',
nullif(count(CASE WHEN result IN( 'E', '5b') THEN 1 END),0) AS '5b/E',
nullif(count(CASE WHEN result IN( 'E+', '5a') THEN 1 END),0) AS '5a/E+',
nullif(count(CASE WHEN result IN( 'D-', '6c') THEN 1 END),0) AS '6c/D-',
nullif(count(CASE WHEN result IN( 'D', '6b') THEN 1 END),0) AS '6b/D',
nullif(count(CASE WHEN result IN( 'D+', '6a') THEN 1 END),0) AS '6a/D+',
nullif(count(CASE WHEN result IN( 'C-', '7c') THEN 1 END),0) AS '7c/C-',
nullif(count(CASE WHEN result IN( 'C', '7b') THEN 1 END),0) AS '7b/C',
nullif(count(CASE WHEN result IN( 'C+', '7a') THEN 1 END),0) AS '7a/C+',
nullif(count(CASE WHEN result IN( 'B-', '8c') THEN 1 END),0) AS '8c/B-',
nullif(count(CASE WHEN result IN( 'B', '8b') THEN 1 END),0) AS '8b/B',
nullif(count(CASE WHEN result IN( 'B+', '8a') THEN 1 END),0) AS '8a/B+',
nullif(count(CASE result WHEN 'A-' THEN 1 END),0) AS 'A-',
nullif(count(CASE result WHEN 'A' THEN 1 END),0) AS 'A',
nullif(count(CASE result WHEN 'A+' THEN 1 END),0) AS 'A+',
nullif(count(CASE result WHEN 'A*-' THEN 1 END),0) AS 'A*-',
nullif(count(CASE result WHEN 'A*' THEN 1 END),0) AS 'A*'
FROM student JOIN subject
ON subject.upn=student.upn
WHERE
[StuYear] = @StuYear AND
[DataCollection] = @DataCollection AND
[Name] = @SubjectName AND (
@TeachingGroup = 'Select All' OR
[TeachingGroup] = @TeachingGroup
) AND (
@SubGroup = 'Select All' OR
Gender = CASE
WHEN @SubGroup = 'GenF' THEN 'F'
WHEN @SubGroup = 'GenM' THEN 'M'
END
)
GROUP BY ks2en
ORDER BY
CASE WHEN ks2en = 'W' THEN 0 ELSE 1 END,
LEFT(ks2en, 1),
RIGHT(ks2en, 1) DESC
@SubjectName = 'Mathematics' の場合、ステートメントは実質的に以下と同じことを行います。
DECLARE
@DataCollection varchar(50) = '2013/14 - Autumn 1 - Targets',
@StuYear VARCHAR(2) = '11',
@SubjectName varchar(100) ='Mathematics',
@TeachingGroup varchar(25) = 'Select All',
@SubGroup varchar(10) = 'Select All'
SELECT CASE WHEN Ks2ma = '' and @SubjectName = 'Mathematics' THEN 'No KS2' ELSE ks2ma END AS 'KS2',
nullif(count(CASE WHEN result = '' THEN 1 END),0) AS 'No Level/Grade',
**SNIP**
nullif(count(CASE result WHEN 'A*' THEN 1 END),0) AS 'A*'
FROM student JOIN subject
ON subject.upn=student.upn
WHERE
[StuYear] = @StuYear AND
[DataCollection] = @DataCollection AND
[Name] = @SubjectName AND (
@TeachingGroup = 'Select All' OR
[TeachingGroup] = @TeachingGroup
) AND (
@SubGroup = 'Select All' OR
Gender = CASE
WHEN @SubGroup = 'GenF' THEN 'F'
WHEN @SubGroup = 'GenM' THEN 'M'
END
)
GROUP BY ks2ma
ORDER BY
CASE WHEN ks2ma = 'W' THEN 0 ELSE 1 END,
LEFT(ks2ma, 1),
RIGHT(ks2ma, 1) DESC
@SubjectName が Science、Art、Technology などの他のものと等しい場合、SQL は次のようになります。
DECLARE
@DataCollection varchar(50) = '2013/14 - Autumn 1 - Targets',
@StuYear VARCHAR(2) = '11',
@SubjectName varchar(100) ='Science',
@TeachingGroup varchar(25) = 'Select All',
@SubGroup varchar(10) = 'Select All'
SELECT CASE WHEN Ks2av = '' and @SubjectName <> 'Mathematics' and @SubjectName <> 'English' THEN 'No KS2' ELSE ks2av END AS 'KS2',
nullif(count(CASE WHEN result = '' THEN 1 END),0) AS 'No Level/Grade',
**SNIP**
nullif(count(CASE result WHEN 'A*' THEN 1 END),0) AS 'A*'
FROM student JOIN subject
ON subject.upn=student.upn
WHERE
[StuYear] = @StuYear AND
[DataCollection] = @DataCollection AND
[Name] = @SubjectName AND (
@TeachingGroup = 'Select All' OR
[TeachingGroup] = @TeachingGroup
) AND (
@SubGroup = 'Select All' OR
Gender = CASE
WHEN @SubGroup = 'GenF' THEN 'F'
WHEN @SubGroup = 'GenM' THEN 'M'
END
)
GROUP BY ks2av
ORDER BY
CASE WHEN ks2av = 'W' THEN 0 ELSE 1 END,
LEFT(ks2av, 1),
RIGHT(ks2av, 1) DESC
私の SQL が生成するグリッドは、以下のようになります。結果セットは小さく見えますが、バックグラウンド データは上記のさまざまな基準に基づいており、各セルで異なる合計が得られます。
KS2 No Result 1/U 2/U 3c/G- 3b/G 3a/G+ 4c/F- 4b/F **snip**
No KS2 1 NULL NULL NULL NULL NULL NULL **snip**
2a NULL NULL NULL NULL NULL NULL 2 1 **snip**
3c 1 NULL NULL NULL NULL NULL NULL NULL **snip**
3b NULL NULL NULL NULL NULL NULL 1 NULL **snip**
3a 1 NULL NULL NULL NULL NULL NULL NULL **snip**
4c NULL 1 1 NULL NULL NULL NULL NULL **snip**
4b NULL NULL NULL NULL NULL NULL NULL NULL **snip**
4a NULL 1 1 NULL NULL NULL NULL NULL **snip**
5c NULL NULL NULL NULL NULL NULL NULL NULL **snip**
5b NULL NULL NULL NULL NULL NULL NULL NULL **snip**