2015-03-07 4 views
0

У меня есть этот простой запрос:MySQL Select с агрегатными функциями

SELECT 
     score,subject_name 
FROM exams_scores,subjects 
WHERE (admission_no = 2771) AND(subjects.subject_code = exams_scores.subject_code) 

Это дает мне: все 5 записей, как ожидалось. Если я:

SELECT 
     score, 
     subject_name, 
     SUM (score) as TOTAL 
FROM exams_scores,subjects 
WHERE (admission_no = 2771) AND (subjects.subject_code = exams_scores.subject_code) 

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

выборочные данные

admission_no  subject  score 
1000    Engligh  80 
1000    Math   90 
1000    Physics  70 
2000    English  45 
2000    Math   80 
2000    Physics  90 

я пытаюсь получить все метки для конкретного admission_no плюс общая так я ожидал:

admission_no: 1000,

оценка: 80,90, 70

всего: 240

+0

добавить в группу 'group by subject_name'. –

+0

Можете ли вы поделиться некоторыми данными примера и результатом, который вы пытаетесь получить? – Mureinik

+0

Я просто добавил некоторые данные – Gordon

ответ

0

Похоже, вы ищете сверток, который вы можете сделать с объединением.

SELECT score,subject_name 
FROM exams_scores,subjects 
WHERE (admission_no = 2771) AND(subjects.subject_code = exams_scores.subject_code) 
UNION ALL 
SELECT sum(score), 'Total' 
FROM exams_scores 
WHERE (admission_no = 2771) 
0

Y наш второй запрос объединяет все ваши строки в одну сумму. Это то, что он должен делать. Для того, чтобы сохранить строки, один способ добавить создание сумму в select заявления, как это:

SELECT 
    score, 
    subject_name, 
    (SELECT SUM (score) FROM exams_scores,subjects WHERE (admission_no = 2771) AND (subjects.subject_code = exams_scores.subject_code)) AS sum 
FROM exams_scores,subjects 
WHERE (admission_no = 2771) AND(subjects.subject_code = exams_scores.subject_code) 

Подобно этому, сумма добавляется к каждой строке.


EDIT: Для того, чтобы добавить общую строку, union оператор может сделать работу:

SELECT 
    score, 
    subject_name, 
    (SELECT SUM (score) FROM exams_scores,subjects WHERE (admission_no = 2771) AND (subjects.subject_code = exams_scores.subject_code)) AS sum 
FROM exams_scores,subjects 
WHERE (admission_no = 2771) AND(subjects.subject_code = exams_scores.subject_code) 

UNION 

SELECT (0, 'Total', (SELECT SUM(... ... ...)) 

Это должно сделать это, но у меня это не тестировалось в деталях. Это только одна строка в конце, а не одна строка для каждой группы.

С union вам всегда нужно одинаковое число, имена и типы столбцов. Также может возникнуть вопрос, когда лучше оставить SQL и использовать структуры PHP для добавления заголовков, форматирования и т. Д.

+0

, что works.so могу ли я вернуть сумму только один раз в другой строке? – Gordon

+0

Я добавил к своему ответу, см. Выше. –

+0

работает после некоторой модификации запроса union.thanks снова – Gordon

Смежные вопросы