2009-12-12 5 views
0

У меня есть MS Access 2007 DB с записями о прошедших и неудачных попытках сдать экзамен.MS Access Typecasting Number to Double

Student_id, Course_id, passed 
S001  C001  0 
S001  C001  1 
S002  C001  1 
S003  C001  0 

«Passed» используется как логическое значение, где 0 не удалось в 1 передается, но хранится в виде числа.

Я хочу построить запрос, отображающий количество попыток на каждого учащегося за курс. Это можно сделать, усредняя пройденное число. S001 имеет в среднем 0,5, S002 от 1 и S003 от 0. Это будет означать, что S001 прошел после двух попыток, S002 после 1 и S003 никогда не делал этого.

SELECT Student_id, Course_id, avg(passed) 
FROM tbl 
GROUP BY Student_id, Course_id, passed 

Проблема в том, что средние являются все 0 или 1. Я думаю, что число не преобразуется в двойной (с учетом знаков после запятой). Как включить среднее значение в тип данных, позволяющий делать десятичные числа?

ответ

3

Я не вижу проблемы. Я создал тестовую таблицу с теми же данными, и когда я запускаю этот SQL:

SELECT Student_id, Course_id, avg(passed) 
    FROM tbl 
    GROUP BY Student_id, Course_id 

Я получаю этот результат:

Student_ID Course_ID AvgOfPassed 
     S001  C001 0.5 
     S002  C001 1 
     S003  C001 0

SQL, вы оригинал отправили должны производить строку для каждой строки в вашем оригинальная таблица, так как вы ошибочно включили PASSED в GROUP BY.

Мой вопрос для вас - это то, где вы просматриваете данные, которые, по вашему мнению, приводят к неправильным результатам. Совершенно ясно, что с предоставленными вами данными и описанием желаемых результатов Access возвращает именно то, что вы просили , если вы правильно пишете SQL.

+0

- вставить знаменитого Гомера "doh!" звук здесь – Gerrit

+0

Мы все были там! –

1

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

Использование:

SELECT student_id, 
     course_id, 
     COUNT(*) AS num_attempts 
    FROM TBL 
GROUP BY student_id, course_id 

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

SELECT t.student_id, 
      t.course_id, 
      COUNT(*) AS num_attempts, 
      x.num_passed/COUNT(*) AS pass_percentage 
     FROM TBL t 
LEFT JOIN (SELECT student_id, 
        course_id, 
        COUNT(*) AS num_passed 
       FROM TBL 
      WHERE passed = 1 
      GROUP BY student_id, course_id) x ON x.student_id = t.student_id 
              AND x.course_id = t.courseid 
    GROUP BY t.student_id, t.course_id 
+0

Это также сработает, но я хотел бы иметь средние значения 0 ... 1. Я могу сортировать по не прошедшему и передаваться по одной переменной. – Gerrit

+0

Исправлено - изменено 'JOIN' на' LEFT JOIN' –