2015-06-16 16 views
2

У меня есть данные студента метки, установленные нижеСумма нескольких столбцов SQL

RegNo Subj1 Mark1 Subj2 Mark2 Subj3 Mark3 Subj4 Mark4 

Где Subj этого название предмета и Марк дал.

Данные таковы, что одна и та же тема может быть в любом столбце для разных студентов. Например. Студент1, возможно, выбрал Eng как Subj1, где, как Student2, возможно, выбрали Subj2.

Теперь мне требуется Среднее по каждому предмету. Как мне найти?

+1

Какой rdbms вы используете? – ughai

+2

Вы должны нормализовать свою модель данных, тогда ваша проблема сводится к очень простому и базовому сводному запросу 'group by'. –

ответ

8

Вы должны исправить вашу структуру данных. Обычно, когда у вас есть столбцы, содержащие одни и те же данные, и только в конце номера выделяются номерами, у вас плохая структура. Вы хотите таблицу, которая выглядит следующим образом:

Regno Subj Mark 

с одной строки на одного студента и subj. Это называется таблицей соединений и частью процесса нормализации данных.

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

select subj, avg(mark) 
from ((select regno, subj1 as subj, mark1 as mark from studentmark) union all 
     (select regno, subj2 as subj, mark2 as mark from studentmark) union all 
     (select regno, subj3 as subj, mark3 as mark from studentmark) union all 
     (select regno, subj4 as subj, mark4 as mark from studentmark) 
    ) sm 
group by sub; 

образца в SQL Fiddle.

+0

Получил свободу добавить демонстрацию скрипки. –

+0

@RagingBull. , , Спасибо. –

1

Вы можете вычислить UNION из четырех случаев, когда объект находится в каждом из четырех столбцов. Например:

SELECT RegNo, Subj1 as Subj, Mark1 as Mark from NormalizeMePlease where Subj1='SQL basics' 
UNION 
SELECT RegNo, Subj2 as Subj, Mark2 as Mark from NormalizeMePlease where Subj2='SQL basics' 
UNION 
SELECT RegNo, Subj3 as Subj, Mark3 as Mark from NormalizeMePlease where Subj3='SQL basics' 
UNION 
SELECT RegNo, Subj4 as Subj, Mark4 as Mark from NormalizeMePlease where Subj4='SQL basics' 

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