Чтобы получить результаты в одной строке, вам нужно объединить результаты выражений падежа;что-то вроде:
SELECT schools.name AS School,
s.lastfirst AS Student,
s.student_number,
s.grade_level,
t.name AS Test_Name,
max(case when ts.name = 'ACT_Reading' then sts.numscore end) as ACT_Reading,
max(case when ts.name = 'ACT_Math' then sts.numscore end) as ACT_Math,
max(case when ts.name = 'ACT_English' then sts.numscore end) as ACT_English,
max(case when ts.name = 'ACT_Science' then sts.numscore end) as ACT_Science,
max(case when ts.name = 'ACT_Composite' then sts.numscore end) as ACT_Composite,
to_char (st.test_date)
FROM students s,studenttestscore sts,studenttest st,test t,testscore ts,schools
WHERE s.id = sts.studentid
AND sts.studenttestid = st.id
AND sts.testscoreid = ts.id
AND ts.testid = t.id
AND s.schoolid = schools.school_number
AND t.name = 'ACT'
AND sts.numscore > 0
and s.enroll_status=0
AND s.schoolid=10
GROUP BY schools.name,
s.lastfirst,
s.student_number,
s.grade_level,
t.name,
st.test_date
ORDER BY s.lastfirst, st.test_date DESC
Поскольку вы эффективно поворачиваете счет, вы не хотите включать его в качестве своего собственного столбца, в список выбора или в группу.
Было бы лучше использовать современный синтаксис объединения вместо древнего списка таблиц, разделенных запятыми в предложении from
;и вы должны также предоставить модель формата в вызове to_char()
для даты:
SELECT schools.name AS school,
s.lastfirst AS student,
s.student_number,
s.grade_level,
t.name AS test_name,
MAX(CASE WHEN ts.NAME = 'ACT_Reading' THEN sts.numscore END) AS act_reading,
MAX(CASE WHEN ts.NAME = 'ACT_Math' THEN sts.numscore END) AS act_math,
MAX(CASE WHEN ts.NAME = 'ACT_English' THEN sts.numscore END) AS act_english,
MAX(CASE WHEN ts.NAME = 'ACT_Science' THEN sts.numscore END) AS act_science,
MAX(CASE WHEN ts.NAME = 'ACT_Composite' THEN sts.numscore END) AS act_composite,
to_char(st.test_date, 'YYYY-MM-DD') AS test_date
FROM students s
JOIN studenttestscore sts ON s.id = sts.studentid
JOIN studenttest st ON sts.studenttestid = st.id
JOIN testscore ts ON sts.testscoreid = ts.id
JOIN test t ON ts.testid = t.id
JOIN schools ON s.schoolid = schools.school_number
WHERE t.name = 'ACT'
AND sts.numscore > 0
and s.enroll_status=0
AND s.schoolid=10
GROUP BY schools.name,
s.lastfirst,
s.student_number,
s.grade_level,
t.name,
st.test_date
ORDER BY s.lastfirst, st.test_date DESC
Эквивалент с использованием pivot
будет выглядеть примерно так:
SELECT school, student, student_number, grade_level, test_name,
act_reading, act_math, act_english, act_science, act_composite,
to_char(test_date, 'YYYY-MM-DD') AS test_date
FROM (
SELECT schools.name AS school,
s.lastfirst AS student,
s.student_number,
s.grade_level,
t.name AS test_name,
ts.name AS test_score_name,
sts.numscore,
st.test_date
FROM students s
JOIN studenttestscore sts ON s.id = sts.studentid
JOIN studenttest st ON sts.studenttestid = st.id
JOIN testscore ts ON sts.testscoreid = ts.id
JOIN test t ON ts.testid = t.id
JOIN schools ON s.schoolid = schools.school_number
WHERE t.name = 'ACT'
AND sts.numscore > 0
AND s.enroll_status=0
AND s.schoolid=10
)
PIVOT (
max(numscore)
FOR test_score_name IN (
'ACT_Reading' AS act_reading,
'ACT_Math' AS act_math,
'ACT_English' AS act_english,
'ACT_Science' AS act_science,
'ACT_Composite' AS act_composite
)
) p
ORDER BY p.student, p.test_date DESC
, но это будетв любом случае переведите его в агрегатную / падежную версию.
(Конечно, все не проверено, поскольку у нас нет вашей схемы для игры ...)