2011-07-11 57 views
1

我有我的數據庫中的以下情況:如何從SQL Server上的表中獲取3個值的平均值?

 id: | second id: | value 
Row 1: 1  | 1   | 123 
Row 2: 1  | 2   | 234 
Row 3: 1  | 3   | 456 
Row 4: 2  | 1   | 987 
Row 5: 2  | 2   | 876 
Row 6: 2  | 3   | 765 
Row 7: 3  | 1   | 345 
Row 8: 3  | 2   | 678 
Row 9: 3  | 3   | 543 
Row 10: 4  | 1   | 345 
... 

每個ID我有3秒IDS,他們總是1,2和3 我需要做的就是讓這3個值的平均值(考慮id爲3的值)並且得到它們的平均值。我需要用長表來做這件事(我想知道如何創建一個特定的視圖來做到這一點)。

任何幫助將受到歡迎。

(對不起,我的問題,但我真的初學者SQL Server上)

+0

我不知道很多有關MSSQL,但我知道,PostgreSQL和甲骨文有亮點功能 - 即你可以調用'平均(值)超過(通過second_id分區)',那會得到你想要的。 MSSQL有類似的東西嗎? – 2011-07-11 14:01:12

+0

我會看看。 – Diogo

+0

我需要一個新的行,使用每個id的3個值的平均值,對於我擁有的第一個id:id:1 |第二個id:avg |值:271 – Diogo

回答

4

只需使用AVG和組由每個ID只。

SELECT id, AVG(value) 
FROM MyTable 
GROUP BY id 
+0

哇,這真的很簡單,我只是讓它變得複雜。非常感謝你幫助我。 – Diogo

0

編輯:

根據您的意見,嘗試:

SELECT id, AVG(value) 
FROM MyTable 
GROUP BY id 
+0

我需要一個新的行,使用每個id的3個值的平均值,對於我擁有的第一個id:id:1 |第二個id:avg |值:271 – Diogo

+0

我認爲它是沒有[第二個id]列的分組,否則它將返回與樣本中相同的數據 – mslliviu

+0

@msll - yep剛剛發現了 – JNK

0

我不知道我理解你以後,但如果你想平均每個second_id試試的:

SELECT second_id, AVG(value) 
FROM table 
GROUP BY second_id 
1

如果你沒有任何形式的窗函數,自加入也應該工作:

select id, second_id, value, avg_val_over_id 
from(
    select id, second_id, value 
    from table 
    )a 
join(
    select id, avg(value) as avg_val_over_id 
    from table 
    group by id 
    )b 
using(id); 
0

如果你想準確,使用

SELECT second_id, AVG(value*1) FROM table GROUP BY second_id 
0

如果您想要在輸出中添加這些平均行,可以這樣做(這裏,我創建了內聯示例數據並將其別名爲T - 它可以輕鬆地從表中選擇基本數據代替):

select ID,COALESCE(CONVERT(varchar(10),subid),'avg'),AVG(val) from (
select 1 as id,1 as subid,123 as val union all 
select 1,2,234 union all 
select 1,3,456 union all 
select 2,1,987 union all 
select 2,2,876 union all 
select 2,3,745 
) t 
group by ID,subid with rollup 
having ID is not null 

結果:

1 1 123 
1 2 234 
1 3 456 
1 avg 271 
2 1 987 
2 2 876 
2 3 745 
2 avg 869