SQL Server - принудительное отображение строки в ResultSet, где отсутствуют значения
Я пытаюсь найти способ принудительного отображения строки в моем выходном наборе результатов, даже если значение не найдено. Я могу быть на правильных линиях, используя COALESCE
, но я не могу понять, где это должно быть в моем запросе.
Я пробовал пару мест, но безуспешно. Мой код пока ниже.
Таким образом, в случае с приведенным ниже кодом будет возвращена строка для предмета, где учащиеся с результатами SEND установлены в 'Y'
, но затем не отображается строка, в которой нет ученика с результатами по предмету, для которого задано значение ОТПРАВИТЬ 'N'
, Однако я хотел бы, чтобы строка отображалась в целях форматирования, поэтому выходной набор результатов всегда имеет одинаковый размер, независимо от того, есть ученики SEND, у которых есть результаты или нет.
DECLARE @AcademicYear varchar(9) = '2017/2018',
@Collection varchar(50) = 'Autumn';
SELECT
Year,
CASE Subject
WHEN 'English' THEN 1
WHEN 'English Language' THEN 2
WHEN 'English Literature' THEN 3
WHEN 'Maths' THEN 4
WHEN 'Science' THEN 5
WHEN 'Additional Science' THEN 6
WHEN 'Biology' THEN 7
WHEN 'Chemistry' THEN 8
WHEN 'Physics' THEN 9
WHEN 'Arabic' THEN 10
WHEN 'Dutch' THEN 11
WHEN 'French' THEN 12
WHEN 'Russian' THEN 13
WHEN 'Spanish' THEN 14
WHEN 'Urdu' THEN 15
ELSE 16
END AS SubjectSort,
Subject,
5 AS GroupSort, Class, Teacher,
'SEND (' + CAST(COUNT(g1.Points) AS varchar) + ')' AS 'Group',
COALESCE(Count(1),0) AS 'No. Girls',
--4+
SUM(CASE
WHEN g1.Points >= 4 THEN 1
ELSE 0
END) AS 'No. 4+/A*-C',
CAST(SUM(CASE
WHEN g1.Points >= 4 THEN 1
ELSE 0
END) AS decimal) / COUNT(g2.Points) AS '% 4+/A*-C',
--5+
SUM(CASE
WHEN g1.Points >= 5 THEN 1
ELSE 0
END) AS 'No. 5+/A*-B',
CAST(SUM(CASE
WHEN g1.Points >= 5 THEN 1
ELSE 0
END) AS decimal) / COUNT(g1.Points) AS '% 5+/A*-B',
--7+
SUM(CASE
WHEN g1.Points >= 7 THEN 1
ELSE 0
END) AS 'No. 7+/A*-A',
CAST(SUM(CASE
WHEN g1.Points >= 7 THEN 1
ELSE 0
END) AS decimal) / COUNT(g1.Points) AS '% 7+/A*-A'
FROM Results r
JOIN Grades g1
ON r.Result = g1.Grade
INNER JOIN Grades g2
ON r.Target = g2.Grade
INNER JOIN Grades g3
ON r.Prediction = g3.Grade
INNER JOIN Grades g4
ON r.Mock = g4.Grade
INNER JOIN students s
ON r.UPN = s.UPN
WHERE r.AcademicYear = @AcademicYear
AND s.AcademicYear = @AcademicYear
AND r.Collection = @Collection
AND COALESCE(SEND,'') = 'Y'
GROUP BY Year, Class, Teacher,
Subject
Order by SubjectSort, Subject, Class, Teacher, GroupSort
1 ответ
Что-то вроде этого:
declare @t table(name varchar(100));
insert into @t values ('Paul'), ('Jane'), ('Mary');
declare @param varchar(100) = 'Sean'--'Paul';
select *
from @t
where name = @param
union all
select 'no name found'
where not exists(select *
from @t
where name = @param
);
Раскомментируйте существующее имя и посмотрите, как возвращаются строки из вашей таблицы; если нет строки, соответствующей вашему параметру, будет возвращено "имя не найдено".