2009-08-25 6 views
1

J'ai une table:Comment construire cette requête dans T-SQL

ID A B C D 
1 10 20 30 5 
2 332 80 32 12 
3 41 20 82 42 
. 
. 
. 

Je veux interroger qui me donne

A B C D 

Où A contient la moyenne de la colonne A pour le top 30 lignes de la table, triées par ID croissant, B contient la moyenne de la colonne B pour les 30 premières lignes de la table, triées par ID croissant, etc.

Si la table a moins de 30 lignes, alors prenez toujours la moyenne , mais ac moyenne ross cependant beaucoup de rangs.

Répondre

3

Essayez ceci:

SELECT AVG (A), AVG(B), AVG(C), AVG(D) 
FROM ThisTable tt 
WHERE tt.ID IN (SELECT TOP 30 ID FROM ThisTable ORDER BY ID ASC) 
6

premier choix sur les 30 lignes, la sélection de celui pour obtenir les moyennes:

select avg(A), avg(B), avg(C), avg(D) 
from (
    select top 30 A, B, C, D 
    from TheTable 
    order by ID 
) x 
-1

Je ne vais pas faire toute requête (quelque chose comme select top 30 avg (a), avg (b), etc) devrait fonctionner, mais pour prendre soin de la commande, il est probablement plus simple de s'assurer que votre colonne d'identifiant est un index clusterisé qui assurera votre commande. L'index clusterisé est bien sûr une ressource précieuse, vous devez évaluer si vous en avez besoin ailleurs.

*** ignorer ma « réponse », il est incorrect (voir commentaires ci-dessous)

+0

En fait, ayant un index cluster ne garantit pas l'ordre du résultat, que le comportement a été abandonné avec (IIRC) SQL Server 2000. – Guffa

+0

Intéressant. Où ont-ils documenté cela? – user29117

+0

Got it .. bonne information ici: http://www.thejoyofcode.com/Guaranteeing_the_order_of_results_in_SQL_Server.aspx http://blogs.msdn.com/conor_cunningham_msft/archive/2008/08/27/no-seatbelt- attendre-ordre-sans-ordre-par.aspx – user29117

Questions connexes