У меня есть таблица результатов учащихся в базе данных MS SQL. Каждый результат учащегося состоит из уровня и оценки. Я прикрепил снимок экрана. Поле intReportID имеет решающее значение для их связи. Ключ TblReportsStoreGradesID.

В моем выводе я хочу, чтобы уровень и оценка отображались в одной строке. Может кто-нибудь дать мне указатель, пожалуйста, потому что я потерялся.

Благодарность

enter image description here

-1
Kev Rodger 4 Фев 2022 в 12:28
Оператор SQL имеет вид SELECT TblReportsStoreGrades.TblReportsStoreGradesID, TblReportsStoreGrades.intReportID, TblReportsStoreGrades.txtGrade FROM TblReportsStoreGrades INNER JOIN TblReportsStore ON TblReportsStoreGrades.intReportID = TblReportsStore.TblReportsStoreGrades =6StoreReports WHERE (TblintReportsStore.
 – 
Kev Rodger
4 Фев 2022 в 12:29
2
Пожалуйста, отредактируйте свой вопрос, чтобы добавить этот код (отформатированный), а затем удалите свой комментарий.
 – 
MatBailie
4 Фев 2022 в 12:32
1
Предоставьте образцы данных и ожидаемые результаты в виде текста в своем вопросе, а не изображение. Посмотрите на lag() & lead()
 – 
Stu
4 Фев 2022 в 12:32

2 ответа

Ваша ROLLUP интуиция неверна, но вы движетесь в правильном направлении.

Вы хотите свернуть несколько строк в одну; это агрегация, поэтому GROUP BY. Затем вам нужна некоторая логика, чтобы определить, какое значение строки относится к какому столбцу в выводе, вы не объяснили это, поэтому я просто буду использовать MIN() и MAX()

SELECT
  g.intReportID,
  MIN(g.txtGrade)   txtGrade_min,
  MAX(g.txtGrade)   txtGrade_max
FROM
  TblReportsStore        AS s
INNER JOIN
  TblReportsStoreGrades  AS g
    ON g.intReportID = s.TblReportsStoreID
WHERE
  s.intReportCycle = 68
GROUP BY
  g.intReportID

Если у вас есть другие полезные столбцы, вы можете вместо этого использовать что-то вроде этого (чтобы выбрать, какие строки входят в какие столбцы)...

MAX(CASE WHEN g.value_type = 'level' THEN g.txtGrade END)  AS level,
MAX(CASE WHEN g.value_type = 'grade' THEN g.txtGrade END)  AS grade
2
MatBailie 4 Фев 2022 в 12:39
Хорошо, не уверен, что понимаю концепцию MAX.
 – 
Kev Rodger
4 Фев 2022 в 14:32
Хорошо понял. Я использовал поле intGradeID для выбора строк.
 – 
Kev Rodger
4 Фев 2022 в 14:41

ВЫБЕРИТЕ МАКС(СЛУЧАЙ, КОГДА g.intGradeID = 32, ТОГДА g.txtGrade END) КАК уровень, МАКС(СЛУЧАЙ, КОГДА g.intGradeID = 33, ТО g.txtGrade END) КАК уровень, TblPupilManagementPupils.txtForename, TblPupilManagementPupils.txtSurname, TblTeachingManagerReportSubjects.StxtSubjectName при s- INNER JOIN TblReportsStoreGrades КАК г ВКЛ g.intReportID = s.TblReportsStoreID INNER JOIN TblPupilManagementPupils ПО s.txtSchoolID = TblPupilManagementPupils.txtSchoolID INNER JOIN TblTeachingManagerSets ПО s.txtSubID = TblTeachingManagerSets.txtSetCode INNER JOIN TblTeachingManagerSubjects НА TblTeachingManagerSets.intSubject = TblTeachingManagerSubjects.TblTeachingManagerSubjectsID ГДЕ ( s.intReportCycle = 68) ГРУППИРОВАТЬ ПО g.intReportID, TblPupilManagementPupils.txtForename, TblPupilManagementPupils.txtSurname, TblTeachingManagerSubjects.txtSubjectName

-1
Kev Rodger 4 Фев 2022 в 14:41
Пожалуйста, отформатируйте свой ответ с возвратом каретки и отступами между предложениями SQL и включите объяснение.
 – 
Andrew Halil
4 Фев 2022 в 15:08