2009-08-25 8 views
1

Ich habe eine Tabelle:Wie diese Abfrage in T-SQL konstruieren

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

Ich möchte, dass mich gibt

A B C D 

abfragen Wenn A den Mittelwert der Spalte A für die Top-30 enthält Zeilen der Tabelle, sortiert nach ID aufsteigend, B enthält den Durchschnitt von Spalte B für die oberen 30 Zeilen der Tabelle, sortiert nach ID aufsteigend usw.

Wenn Tabelle weniger als 30 Zeilen hat, dann immer noch den Durchschnitt , aber durchschnittliche ac ross aber viele Reihen hat es.

Antwort

3

Try this:

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

zuerst die 30 Zeilen auswählen, die wählen Sie aus, dass die Mittelwerte zu erhalten:

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

Ich werde nicht die ganze Abfrage tun (so etwas wie Wählen Sie oben 30 avg (a), avg (b), usw.) sollte funktionieren, aber um die Reihenfolge zu kümmern, ist es wahrscheinlich am einfachsten sicherzustellen, dass Ihre ID-Spalte ein gruppierter Index ist, der Ihre Bestellung sicherstellen wird.

Der Clustered Index ist natürlich eine wertvolle Ressource, die Sie auswerten müssen, wenn Sie sie woanders brauchen.

*** ignorieren meine „Antwort“, es ist falsch (siehe Kommentare unten)

+0

Eigentlich hat einen Clustered-Index hat nicht die Reihenfolge des Ergebnisses zu gewährleisten, wurde dieses Verhalten mit (IIRC) SQL Server gelöscht 2000. – Guffa

+0

Interessant. Wo haben sie das dokumentiert? – user29117

+0

Verstanden .. gute Informationen hier: 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- Erwartung-Bestellung-ohne-Bestellung-von.aspx – user29117