Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SQL-запрос, Вывод среднего балла 
V
    Опции темы
Flotskiy
Дата 18.8.2006, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 15.11.2004
Где: г. Омск

Репутация: 1
Всего: 2



Добрый день всем! Помогите советом или примером (VB6, Access97)
В таблице "Eksamen"  есть поля : "Mat", "Him", "Fiz", "Rus"...
 записи:   1)                                       4        3         3       4
                 2)                                      4                   4        5
                 3)                                                 4        3
и т.д. (не все поля заполнены)
Надо вывести запросом средний балл по записям
Код

"SELECT СРЗНАЧ(Mat, Him, Fiz, Rus) As Sred_Ball
FROM Eksamen"

 В Excel`e есть функция "СРЗНАЧ", вот что-то такое и в запрос нужно
С уважением 


Это сообщение отредактировал(а) Flotskiy - 18.8.2006, 10:42
--------------------
FlotskiySk k
PM MAIL   Вверх
Voldemar2004
Дата 18.8.2006, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: 7
Всего: 23



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


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Flotskiy
Дата 18.8.2006, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 15.11.2004
Где: г. Омск

Репутация: 1
Всего: 2



Voldemar2004,  не пойдет. Если бы все поля были заполнены, тогда другое дело.
А то в одной записи все поля заполнены, тогда делить на 4, в другой записи -  заполнено два поля,  тогда делить на 2...
Всего доброго
--------------------
FlotskiySk k
PM MAIL   Вверх
Voldemar2004
Дата 18.8.2006, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: 7
Всего: 23



Flotskiy, ну так это легко решается: проверка-цикл по строке - если строка не пуста (!NULL) увеличиваем счетчик i, в другую переменную - если строка не пуста - записываем сумму значений в строчке - дошли до конца строки - делим эту сумму на количество ненулевых столбцов, т.е. i.

Ну типа: 

1 2 3 4   i = 4 , summa =  1 + 2 + 3 + 4, result = 2.5
2    3 1   i = 3 , summa =  2 + 3 + 1,       result = 2
3       4   i = 2 , summa =  3 + 4,             result = 3.5

Добавлено @ 12:49 
Можно использовать (да и нужно) объект ADO RecordSet и написать простенькую функцию.


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Akina
Дата 18.8.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Flotskiy, как обычно, все проблемы - от неверной структуры БД.

Переделай таблицу в следующую:

ID (primary IDX)
StudentID
SubjectID
Mark

и запрос твой родится играючи. Да и куча иных задач станет в выполнении проще.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Flotskiy
Дата 19.8.2006, 05:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 15.11.2004
Где: г. Омск

Репутация: 1
Всего: 2



Akina,  Структура БД такова:
Табл. "Glavnaua", имеет счетчик GlavID, поля "Family", и т.д.
Табл. "Eksamen", имеет индексированное поле "EksID"( для связывания с табл1),  поля "MatE", "HimE", "FizE", "RusE", Запрос такой:
Код

 "SELECT  Glavnaja.Family, Eksamen.MatE, Eksamen.HimE, Eksamen.FizE, Eksamen.RusE, " & _
" Сюда нужно вставить сн.1 " & _
"FROM Glavnaja, Eksamen WHERE Glavnaja.GlavID=Eksamen.EksID  Order BY  Family"
'сн.1 "AVG(MatE+HimE+FizE+RusE) As Sred_Ball " , для нахождения среднего числа по каждой  записи


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


Это сообщение отредактировал(а) Flotskiy - 19.8.2006, 05:54
--------------------
FlotskiySk k
PM MAIL   Вверх
Тутанхамец
Дата 19.8.2006, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: 4
Всего: 6



Akina абсолютно прав. Если переделать структуру, запрос будет выглядеть элементарно. Что-то типа:

SELECT AVG(Mark) AS Среднее FROM Marks WHERE Family="Иванов" 

Функция AVG считает среднее ПО СТРОКАМ, а не ПО СТОЛБЦАМ. С точки зрения реляционных БД считать среднее по одной строке нескольких столбцов - абсурд, так как все данные, по которым в принципе может понадобиться считать среднее, должны быть в строках одного столбца. 

А раз уж таблица такая неправильная, то может тебе считать среднее на этапе заполнения таблицы и писать его в отдельный столбец? 


PM MAIL   Вверх
Flotskiy
Дата 20.8.2006, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 15.11.2004
Где: г. Омск

Репутация: 1
Всего: 2



Тутанхамец,  Благодарю всех за содействие. Если бы заказчик сразу сказал, что надо будет выводить среднее значение, то, конечно, в таблице добавить доп. поле и расчет проводить при вводе инфы. У меня в другом месте, с другими данными так и делается.  Ну да ладно, как нибудь... 
Благодарю всех, 
наилучшие пожелания
--------------------
FlotskiySk k
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.1109 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.