2016-10-11 27 views
0

我有以下查詢只得到平均值:如何從連接表

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 

但是,這給了我'選擇語句上的非法符號*'。有誰知道如何做到這一點?

+0

你真的有你在陳述中的那些'**'? – jarlh

+1

一般GROUP BY規則說: 「如果指定了GROUP BY子句,則SELECT列表中的每個列引用都必須標識分組列或作爲set函數的參數。」即你不能選擇所有那樣的列,也不要在GROUP BY中明確列出它們。 – jarlh

+0

不,那是我試圖強調第一個和第二個查詢之間的區別。 – marqram

回答

1

作爲註釋之一,您不能在select中選擇不在GROUP BY子句中或在聚合函數中使用的列。 [在OP如有不明,每沒有提及平臺或DB2的發行,甚至也不是一個特定於平臺的DB2標籤包含]

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 
0

,或者在可用/支持,或許是:

試試這個以下查詢。注意:根據需要刪除或調整DEC鑄造標量;我只是選擇了一個值以獲得更好的報告尺寸與我的樣本數據因爲沒有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             
+0

謝謝,這似乎是我正在尋找的!我會在今天晚些時候測試它。 – marqram