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
                 );

Раскомментируйте существующее имя и посмотрите, как возвращаются строки из вашей таблицы; если нет строки, соответствующей вашему параметру, будет возвращено "имя не найдено".

Другие вопросы по тегам