如何只从连接表中获取平均值

时间:2016-10-11 06:26:47

标签: sql db2

我有以下查询:

with D1 as (
        select v06.ID
            ,AVG(TD.A) as A_avg
            ,AVG(TD.B) as B_avg
        from v06
        inner join v07 TD
            on v06.ID= TD.ID
            and v06.timestamp= TD.timestamp
        where v06.X is not NULL
        group by v06.ID
)
select * from D1

现在我按v06.ID分组。但是,我想要的是保留v06的所有字段,同时只添加表TD中的两个平均值。所以我试过了:

with D1 as (
        select v06.*
            ,AVG(TD.A) as A_avg
            ,AVG(TD.B) as B_avg
        from v06
        inner join v07 TD
            on v06.ID= TD.ID
            and v06.timestamp= TD.timestamp
        where v06.X is not NULL
        group by v06.*
)
select * from D1

但是这给了我在select语句中的'非法符号*'。有谁知道如何实现这个目标?

2 个答案:

答案 0 :(得分:1)

作为评论之一,您不能在选择中有一列不在GROUP BY子句中或在聚合函数中使用。

试试这个:

with D1 as (
        select v06.ID
            ,AVG(TD.A) as A_avg
            ,AVG(TD.B) as B_avg
        from v06
        inner join P.B90T75 TD
            on v06.ID= TD.ID
            and v06.timestamp= TD.timestamp
        where v06.X is not NULL
        group by v06.ID
)
select d2.*, d1.a_avg, d1.b_avg 
from D1 
     join v06 D2 
       on d1.id = d2.id

答案 1 :(得分:0)

或者,如果可用/支持[未知,如果没有提及OP中的DB2平台或发行版,甚至包括特定于平台的DB2标记],也许是以下查询。注意:根据需要删除或调整DEC铸造标量;我只选择 small 值来获得更好的报告大小我的样本数据,因为没有带有样本数据的DDL,也没有OP中提供的预期结果可用于测试:

select a.*                                                 
     , dec( avg(a) over(partition by a.id ) , 11 ) as avg_a
     , dec( avg(b) over(partition by a.id ) , 11 ) as avg_b
from v06 as a                                              
join v07 as b                                           
  on a.id = b.id                                           
 and a.timestamp = b.timestamp                             
where x is not null                                        
order by id                                                
相关问题