2016-12-07 1 views
1
SELECT StudentID, Fname, LName, S_LessonNumber, LessonName, Date, Cost 
FROM STUDENT_2 
JOIN LESSON ON S_LessonNumber = LessonNumber 
NATURAL JOIN STUDENT_1 
WHERE StudentID = '1001' 

Полученная таблица я получаю с этим запросом заключается в следующем,Как вернуть несколько строк при использовании функций Aggregate?

enter image description here

При попытке отобразить общую сумму, уплаченную, а также общее количество уроков, принятое, используя следующий запрос, я только возможность возврата одной строки.

SELECT StudentID, Fname, LName, S_LessonNumber, LessonName, Date, 
Cost,COUNT(DISTINCT S_LessonNumber) , SUM(Cost) 
FROM STUDENT_2 
JOIN LESSON ON S_LessonNumber = LessonNumber 
NATURAL JOIN STUDENT_1 
WHERE StudentID = '1001' 

enter image description here

Есть ли способ, что я могу вернуть все 4 строки со значениями для COUNT (DISTINCT S_LessonNumber) и SUM (цена) повторяется.

Нужный выход следующим образом:

StudentID FName LName S_LessonNumber LessonName Date Cost COUNT SUM 
1001  Hannibal Lecter 7    C---  --- 15 4  60 
1001  Hannibal Lecter 6    Wa--  --- 15 4  60 
1001  Hannibal Lecter 5    Tri--  --- 15 4  60 
1001  Hannibal Lecter 1    Cha-  --- 15 4  60 
+2

Не используйте 'NATURAL JOIN'! Это ошибка, ожидающая своего появления. Явно покажу ключи, используемые для объединений, если вы хотите, чтобы запрос, который можно было обслуживать, и что другие люди могли понять. –

+0

Вы можете попытаться использовать аналитическую функцию, если она доступна в MySQL. – dood

+0

@ GordonLinoff Отмечено, спасибо. –

ответ

0

Агрегатные функции всегда будет возвращать 1 строку. При использовании подзапросов не проблема, вы можете сделать:

SELECT StudentID, Fname, LName, S_LessonNumber, LessonName, Date, Cost, 
    (SELECT COUNT(DISTINCT S_LessonNumber) FROM STUDENT_2 JOIN LESSON ON S_LessonNumber = LessonNumber NATURAL JOIN STUDENT_1 WHERE StudentID = '1001') AS COUNT, 
    (SELECT SUM(Cost) FROM STUDENT_2 JOIN LESSON ON S_LessonNumber = LessonNumber NATURAL JOIN STUDENT_1 WHERE StudentID = '1001') AS SUM 
FROM STUDENT_2 
JOIN LESSON ON S_LessonNumber = LessonNumber 
NATURAL JOIN STUDENT_1 
WHERE StudentID = '1001' 
0

Проверьте это здесь: http://rextester.com/SBUQ82088

create table if not exists fstudents (id int, fname text, lname text); 
create table if not exists fstudents2 (student_id int, lesson_number int, lesson_date date, cost int); 
create table if not exists flessons (number int, name text); 
insert into fstudents values (1001, 'Anibal', 'Lecter'); 
insert into flessons values (1, 'Cha Cha'); 
insert into flessons values (2, 'Waltz'); 
insert into flessons values (3, 'Country'); 
insert into flessons values (4, 'Triple2'); 
insert into fstudents2 values (1001, 1, '2016-10-06', 15); 
insert into fstudents2 values (1001, 2, '2016-10-07', 15); 
insert into fstudents2 values (1001, 3, '2016-10-08', 15); 
insert into fstudents2 values (1001, 4, '2016-10-09', 15); 

Используйте подзапрос посчитать сумму, а затем присоединить его к основному запросу.

select st2.student_id, st.fname, st.lname, ls.name, st2.lesson_date, st2.cost, agg.courses, agg.total_cost 
from fstudents2 st2 
    join fstudents st on st2.student_id = st.id 
    join flessons ls on st2.lesson_number = ls.number 
    join (select st3.student_id, count(st3.lesson_number) courses, sum(st3.cost) total_cost 
      from fstudents2 st3 
      group by st3.student_id) agg on agg.student_id = st2.student_id 
where 
    st2.student_id = 1001;  
Смежные вопросы