2010-09-09 3 views
1

Я создал таблицу, использующую PIVOT, а столбцы столбцов динамические. Один из выходных данных приведен ниже:SQLServer Calculate Average of Multiple Columns

user  test1 test2 test3 
-------------------------------- 
A1   10  20  30 
A2   90  87  75 
A3   78  12  34 

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

Теперь я хочу узнать средние оценки каждого пользователя, а также средние оценки каждого теста.

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

Есть ли способ сделать это ??

Пожалуйста, помогите.

Махеш

ответ

1

Можете ли вы сделать это в своем источнике данных, прежде чем вы его развернете?

2

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

SELECT 
    user, 
    (test1 + test2 + test3)/3 AS average_mark 
FROM users 

Или игнорировать NULL значения:

SELECT 
    user, 
    (ISNULL(test1, 0) + ISNULL(test2, 0) + ISNULL(test3, 0))/(
     CASE WHEN test1 IS NULL THEN 0 ELSE 1 END + 
     CASE WHEN test2 IS NULL THEN 0 ELSE 1 END + 
     CASE WHEN test3 IS NULL THEN 0 ELSE 1 END 
    ) AS average_mark 
FROM users 

Ваша структура таблицы имеет два недостатки:

  • Поскольку ваша структура таблицы создается динамически, вам также придется динамически строить этот запрос.
  • Поскольку некоторые студенты не прошли все тесты, у вас могут быть некоторые значения NULL.

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

user test mark 
------------------- 
A1  1  10 
A2  1  90 
A3  1  78 
A1  2  20 
A2  2  87 
A3  2  12 
A1  3  30 
A2  3  75 
A3  3  34 

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

SELECT user, AVG(mark) AS average_mark 
FROM users 
GROUP BY user 

И это, чтобы получить средний балл на тест:

SELECT test, AVG(mark) AS average_mark 
FROM users 
GROUP BY test 
+0

Спасибо за ответ. Мои данные также содержат значения NULL, поэтому среднее число по числу столбцов может давать неверные результаты. – Mahesh

1

Простой ответ UNPIVOT так же, как вы только PIVOTed. Но лучший ответ - не делать PIVOT в первую очередь! Сначала сохраните нераспознанные данные в таблице, затем от , чтобы сделать свой PIVOT и ваш средний.

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

  • Нет связанных вопросов^_^