2010-09-09 5 views
1

je générer une table en utilisant PIVOT et ouput de colonnes sont dynamiques. L'un de la sortie est telle qu'indiquée ci-dessous:SQLServer Calculer moyenne des colonnes multiples

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

La sortie du tableau ci-dessus représente une liste d'utilisateurs présents tests. Les tests seront ajoutés dynamiquement, de sorte que les colonnes sont de nature dynamique.

Maintenant, je veux savoir les notes moyennes de chaque utilisateur, ainsi que des notes moyennes de chaque test.

Je suis en mesure de calculer la moyenne de chaque test, mais ils nous ont intrigués de découvrir la moyenne de chaque utilisateur.

Est-il possible de le faire ??

Aidez-nous s'il vous plaît.

Mahesh

Répondre

1

Pouvez-vous le faire sur votre source de données avant de le faire pivoter?

2

Vous pouvez ajouter les marques pour chaque utilisateur, puis diviser par le nombre de colonnes:

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

ou d'ignorer les valeurs 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 

Votre structure de table a deux inconvénients:

  • Parce que votre structure de table est créée dynamiquement, vous devez également construire cette requête dynamiquement.
  • Étant donné que certains élèves n'auront pas passé tous les tests, vous risquez d'avoir des valeurs NULL.

Vous voudrez peut-être envisager de modifier la structure de votre table pour résoudre ces deux problèmes. Je suggère que vous utilisez la structure suivante pour votre table:

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 

Ensuite, vous pouvez faire pour obtenir la note moyenne par utilisateur:

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

Et ceci pour obtenir la note moyenne par test:

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

Merci pour la réponse. Mes données contiennent également des valeurs NULL, donc prendre la moyenne en nombre de colonnes peut donner des résultats erronés. – Mahesh

1

La réponse est simple à UNPIVOT de la même façon que vous venez pivotée. Mais la meilleure réponse est de ne pas faire le PIVOT en premier lieu! Stockez d'abord les données non-pivotées dans un tableau, puis que faites votre PIVOT et votre moyenne.

Questions connexes