Sql;从同一列中选择平均值和一个值

时间:2015-03-18 18:52:08

标签: sql-server select average

如何将同一列中的平均值和另一个值从新表中的两个不同列中获取?

我有这个:

Person_ID col2         col3_values
1         101010A      20000
1         101010B      30000
2         101010A      25000
2         101010B      30000
3         101010A      22000
3         101010B      24000

我想要一个表格,其中col3_values的平均值为ID:s,来自col1_ID(1,2,3),然后将此平均值与保存col1_ID:值的列进行比较,如下所示:

col2        AVG(value personID_1-3)  Value PersonID_1
101010 A    22333                    20000
101010 B    28000                    30000

我尝试了很多代码但没有任何效果。有人可以帮我这个吗?如果这有效,我将不胜感激,如果我还能得到第四列,则显示平均列和第三列之间保持ID_1:s值的差异。

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点,一种方法是使用outer apply构造:

select 
    col2, 
    AVG(t.col3_values) as "AVG(value personID_1-3)", 
    a.col3_values as "Value PersonID_1",
    AVG(t.col3_values) - a.col3_values as "Difference"
from your_table t 
outer apply (
    select col3_values from your_table  where Person_ID = 1 and t.col2 = col2
) a
group by col2, a.col3_values

或者你可以使用相关的子查询:

select 
    col2, 
    AVG(t.col3_values) as "AVG(value personID_1-3)", 
    (
      select col3_values from your_table where Person_ID = 1 and t.col2 = col2
    ) as "Value PersonID_1"
from your_table t 
group by col2

示例输出:

Query 1:
col2                 AVG(value personID_1-3) Value PersonID_1 Difference
-------------------- ----------------------- ---------------- -----------
101010A              22333                   20000            2333
101010B              28000                   30000            -2000


Query 2:    
col2                 AVG(value personID_1-3) Value PersonID_1
-------------------- ----------------------- ----------------
101010A              22333                   20000
101010B              28000                   30000