2014-03-30 42 views
0

我想对两个表(表示井中的数据)执行一些复杂聚合。使用复合(>和<)加入标准对两个表进行SQL聚合

Table 1 
ID FM TODEPTH FROMDEPTH 
1 A 1  20 
1 B 20  60 
1 C 60  100 
2 A 1  30 
2 B 30  40 
2 C 40  80 
... 

Table 2 
ID VAL1 VAL2 TODEPTH FROMDEPTH 
1 0.2 0.4 18  19 
1 0.3 0.5 19  20 
1 0.1 0.2 55  58 
1 0.2 0.3 58  59 
1 0.5 0.8 62  68 
1 0.6 1.2 72  75 
... 

and desired output is: 
ID FM Avg(Val1) Avg(val2) 
1 A 0.3  0.4 
1 B 0.1  0.2 
1 C 0.6  0.9 
2 A 0.2  0.4 
.... 

聚集规则是select values from Table2 where ID = table1.ID and todepth >= table1.todepth and fromdepth <= table1.fromdepth, average on table1.FM

我很努力,看看这是否可以写在SQL或者我需要去的代码。

+1

似乎它会很容易用SQL编写...你到目前为止尝试过什么? – user1759942

回答

0

尝试是这样的:

SELECT 
    t1.id, t1.fm, AVG(t2.val1), AVG(t2.val2) 
FROM 
    table1 t1 
    INNER JOIN table2 t2 ON t1.id = t2.id 
WHERE 
    t2.todepth >= t1.todepth 
    AND t2.fromdepth <= t1.fromdepth 
GROUP BY 
    t1.id, t1.fm 
+0

适合我。我的并发症是“table1”实际上不是一个表,而是另一个选择查询。然而,有了指导模板,我认为我想它 – Scaddenp

+0

好交易。如果它回答你的问题,请随时[接受这个答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 – grantmcconnaughey

0

试试这个:

SELECT 
    T1.ID, 
    T1.FM, 
    COALESCE(AVG(T2.VAL1), 0) as AVGVAL1, 
    COALESCE(AVG(T2.VAL2), 0) as AVGVAL2 
FROM Table1 T1 
    LEFT JOIN Table2 T2 
    ON T1.ID = T2.ID 
     AND T1.TODEPTH <= T2.TODEPTH 
     AND T1.FROMDEPTH >= T2.FROMDEPTH 
GROUP BY T1.ID, T1.FM 
0

在您预期的结果集的舍入看起来有点滑稽,但这里有一个查询,你可以投,轮修改,天花板和/或地板功能。

SELECT Table1.ID, Table1.FM, CAST(AVG(Table2.Val1) AS DECIMAL(2,1)), CAST(AVG(Table2.Val2) AS DECIMAL(2,1)) 
FROM Table2 
INNER JOIN Table1 
    ON Table1.iD = Table2.ID 
    AND Table2.TODEPTH >= Table1.TODEPTH 
    AND Table2.FROMDEPTH <= Table1.FROMDEPTH 
GROUP BY Table1.ID, Table1.FM