2010-07-23 20 views
0

J'essaie d'écrire cette requête, qui calcule la valeur moyenne de toutes les colonnes sauf celle qui contient la valeur de type, dont je regroupe l'ensemble de la requête.Comptage de tous les autres types sauf l'actuel

Donc, pour 4 types par exemple, chaque colonne de la table résultante contiendra la moyenne de toutes les valeurs des trois autres types, j'ai besoin d'exclure les lignes du type courant.

À titre d'exemple, si je devais calculer la valeur moyenne de chaque type pour lui-même, la requête ressemblerait à ceci:

SELECT 

SUM(some value)/COUNT(TYPE) 

FROM TEMPTABLE 
GROUP BY TYPE 

Maintenant, je suis en train de calculer la moyenne totale de trois autres. Merci.

+0

la DB est SYBASE par la façon dont – Halo

+0

Etes-vous sûr que vous voulez dire des colonnes, pas de lignes? Pouvez-vous poster la structure de la table? –

Répondre

1

Vous pouvez faire une requête pour obtenir les types distincts, et LEFT JOIN la même table, la vérification de type inégalité:

SELECT t1.type, 
     SUM(t2.some_value)/COUNT(t2.type) 
FROM (SELECT DISTINCT type FROM temptable) t1 
LEFT JOIN temptable t2 ON (t1.type <> t2.type) 
GROUP BY t1.type 

Puisque vous voulez que la moyenne, vous pouvez remplacer la ligne

FROM (SELECT DISTINCT type FROM temptable) t1 

par

FROM temptable t1 

mais la première solution pourrait mieux fonctionner, si nce le nombre de lignes est réduit plus tôt.

+0

merci, je suppose que j'ai besoin d'écrire quelque chose comme ceci comme requête imbriquée, parce que cette partie est seulement un membre dans un géant SELECT. donc je ne peux pas utiliser FROM ou WHERE directement – Halo

+0

Il ne devrait y avoir aucune raison pour que la réponse de Peter ne puisse pas fonctionner comme une requête sous-/imbriquée, devrait-il y avoir? (Mon Sybase est rouillé) – Tobiasopdenbrouw

+0

non, je suppose que non – Halo

0

Le point de départ est ici pour faire une jointure cartésienne entre vos types et votre temptable (deviner votre structure de tables est: type (id, type), valueTable (id, type_id, some_value))

La requête suivante

SELECT t.type, SUM (vt.someValue)/ COUNT (*) AS somme à partir du type t, valueTable vt OÙ vt.type_id! = t.id GROUP BY t.type

devrait faire l'affaire.

+0

thx, bien que j'insère dans valueTable. Il n'y a que la tentation au début – Halo

0

devrait fonctionner sur Sybase aussi:

SELECT 
    SUM(some value)/SUM(CASE WHEN TYPE = 1 THEN 1 ELSE 0 END) 
FROM TEMPTABLE 
GROUP BY TYPE 
+0

oui c'est vrai mais la requête le fera pour chaque type. donc je ne veux pas utiliser une valeur constante – Halo

0

Est-ce que cela ce que vous avez besoin?

(Peut-être avec une autre déclaration CASE pour éviter les erreurs de division par zéro s'il y a une possibilité aucune d'un type peut être retourné, je l'ai représenté pas non plus explicitement dans le cas où type est NULL)

SELECT 

SUM(CASE WHEN TYPE <> 'Type1' THEN someValue ELSE 0 END)/
    SUM(CASE WHEN TYPE = 'Type1' THEN 1 ELSE 0 END) AS T1, 

SUM(CASE WHEN TYPE <> 'Type2' THEN someValue ELSE 0 END)/
    SUM(CASE WHEN TYPE = 'Type2' THEN 1 ELSE 0 END) AS T2, 

SUM(CASE WHEN TYPE <> 'Type3' THEN someValue ELSE 0 END)/
    SUM(CASE WHEN TYPE = 'Type3' THEN 1 ELSE 0 END) AS T3, 

SUM(CASE WHEN TYPE <> 'Type4' THEN someValue ELSE 0 END)/
    SUM(CASE WHEN TYPE = 'Type4' THEN 1 ELSE 0 END) AS T4 
FROM TEMPTABLE 
+0

thx ce n'est en fait pas une mauvaise idée, mais j'ai plutôt soustrait la valeur actuelle de la somme et divisée en (COUNT -1) – Halo

0

Je pense que vous pouvez simplement utiliser ceci:

SELECT type, avg(col_01) 
FROM myTable 
GROUP BY type