SQL: пустые значения заполнителей в списке ТОП 10, который возвращает менее десяти значений - PullRequest
0 голосов
/ 19 января 2020

Я написал запрос, который возвращает набор результатов из 10 лучших значений. Это прекрасно работает, но когда результирующий набор возвращает список значений, который меньше 10 элементов, тогда я бы хотел, чтобы запрос возвращал значения заполнителя, чтобы передать результирующий набор из десяти значений, т.е. NULLS.

Текущий набор результатов:

SENDBottom10Prog    CFC 11  Business    Surname1    Forename1   11MO    50      2   4   U   -4.00
SENDBottom10Prog    CIN 11  Business    Surname2    Forename2   11MO    86.9    0   4   2   -2.00
SENDBottom10Prog    N   11  Business    Surname3    Forename3   11MC    100     0   3   2   -1.00
SENDBottom10Prog    N   11  Business    Surname4    Forename4   11MO    97.62   5   4   6   2.00

Желаемый набор результатов:

SENDBottom10Prog    CFC   11    Business    Surname1    Forename1   11MO    50      2    4    U     -4.00
SENDBottom10Prog    CIN   11    Business    Surname2    Forename2   11MO    86.9    0    4    2     -2.00
SENDBottom10Prog    N     11    Business    Surname3    Forename3   11MC    100     0    3    2     -1.00
SENDBottom10Prog    N     11    Business    Surname4    Forename4   11MO    97.62   5    4    6      2.00
NULL                NULL  NULL  NULL        NULL        NULL        NULL    NULL    NULL NULL NULL   NULL
NULL                NULL  NULL  NULL        NULL        NULL        NULL    NULL    NULL NULL NULL   NULL
NULL                NULL  NULL  NULL        NULL        NULL        NULL    NULL    NULL NULL NULL   NULL
NULL                NULL  NULL  NULL        NULL        NULL        NULL    NULL    NULL NULL NULL   NULL
NULL                NULL  NULL  NULL        NULL        NULL        NULL    NULL    NULL NULL NULL   NULL
NULL                NULL  NULL  NULL        NULL        NULL        NULL    NULL    NULL NULL NULL   NULL

Вот мой код:

DECLARE
@AcademicYear varchar(9) = '2019/2020',
@Collection varchar(50) = 'autumn',
@StuYear       VARCHAR(2) = '11';

Select 'SENDBottom10Prog' as List, SG, Year, Subject, Surname, Forename, Form, [AM/PM], Behaviour, FFT20, Prediction, Residual

From (

SELECT s.sg, s.Year,r.Subject as 'Subject', s.Surname, s.Forename, s.Form,s.attendance as 'AM/PM', s.behaviour, r.Target as FFT20, r.Prediction, g3.Points-g2.Points as Residual, g3.graderank, row_number() over(partition by r.subject order by s.year, r.subject, cast(g3.Points-g2.Points as decimal) asc, g3.graderank asc, Attendance asc, Behaviour, s.Surname, s.Forename) as rn

FROM Results r
LEFT JOIN Grades g1
  ON r.Result = g1.Grade
LEFT JOIN Grades g2
  ON r.Target = g2.Grade
LEFT JOIN Grades g3
  ON r.Prediction = g3.Grade
LEFT JOIN students s
  ON r.UPN = s.UPN

WHERE r.AcademicYear = @AcademicYear
AND s.AcademicYear = @AcademicYear
AND r.Collection = @Collection
AND s.year=@StuYear
AND SEND='Y'
AND s.NotIncluded = 'N'


) as T
where T.rn <=10;

1 Ответ

2 голосов
/ 19 января 2020

Если вы хотите получить ровно десять строк, но их нет, то вам нужно их построить. Вот один из методов:

with t as (
      < your query here >
     )
select t.*
from (values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)
     ) v(n) left join
     t
     on t.rn = v.n
order by v.n;
...