从表1中的表2匹配间隔中获得平均值和

时间:2018-08-15 00:48:59

标签: sql-server aggregate

情况

  • 我有两个下表。
  • 我想从table1中获取平均值和总和 落在表2的间隔中(也有输出数据),其中Sunnary为NULL。

表1

Name    Val1    Val2    Start   End Summary
xyz     6.7     5.33    0       10  test1
xyz     7.16    4.41    10      20  test2
xyz     2.52    1.69    20      30  NULL
xyz     1       1.77    30      40  NULL
xyz     4       5.28    40      50  NULL
xyz     2.7     4.91    50      60  NULL
xyz     1.72    1.88    60      70  NULL
xyz     0.98    1.64    70      80  NULL
xyz     1.28    1.26    80      90  NULL
xyz     1.51    1.29    90      100 NULL
xyz     1.62    1.69    100     110 NULL
xyz     2.49    2.89    110     120 NULL
xyz     1.2     2.11    120     130 NULL
xyz     1.45    1.27    130     140 NULL
xyz     1.62    1.61    140     150 NULL
xyz     1.96    1.68    150     160 NULL
xyz     2.03    2.48    160     170 NULL
xyz     2.42    1.72    170     180 NULL
xyz     1.64    1.47    180     190 NULL
xyz     3.08    3.36    190     200 NULL
xyz     1.45    2.41    200     210 NULL
xyz     1.86    3.23    210     220 NULL
xyz     1.25    1.96    220     230 NULL
xyz     2.68    2.64    230     240 NULL
xyz     1.99    3.92    240     250 NULL
xyz     1.76    3.35    250     260 NULL
xyz     2.94    3.86    260     270 NULL
xyz     4.1     4.15    270     278 NULL

表2

Name    Begin           End             Summary
xyz     0               100             test1/test2
xyz     100             200             NULL
xyz     200             278             NULL

表3(输出表)

Name    Avg(Val1)   Sum(Val1)   Avg(Val1)   Avg(Val2)       Begin           End         Summary
xyz     1.9637      15.71       2.465       19.72           0               100         test1/test2
xyz     1.951       19.51       2.028       20.28           100             200         NULL
xyz     2.25375     18.03       3.19        25.52           200             278         NULL

我尝试了以下代码,但是没有用

select A.[Name], avg(A.Val1), sum(A.Val1), avg(A.Val2)
,sum(A.Val2), B.Start, B.End  from table1 A
left join table2 B on A.Start = B.Start and A.End = B.End
where  A.Name=B.Name
group by Name

2 个答案:

答案 0 :(得分:1)

我看不到需要使用LEFT JOIN,两个表之间的所有联接条件都应该在ON子句中

此外,您的where子句还需要条件A.Summary is null。 (我假设您是指表1中的Summary

select A.[Name], 
       avg(A.Val1), 
       sum(A.Val1), 
       avg(A.Val2),
       sum(A.Val2), 
       B.Start, 
       B.End  
from   table1 A
       inner join table2 B on  A.Name   = B.Name
                          and  A.Start >= B.Start 
                          and  A.End   <= B.End
where  A.Summary is null
group by A.Name, B.Start, B.End

答案 1 :(得分:0)

您不应以相等的方式加入,应为> =和<或>和<=,具体取决于边界所在的位置。但是您需要桌子2的一端超出实际数字,因此将最后一个999或第一个-1设为1。并且因为您的名字是联接的一部分,所以请保持一致。

select A.[Name], B.Start, B.End, avg(A.Val1), sum(A.Val1), avg(A.Val2)
,sum(A.Val2), B.Start, B.End  from table1 A
left join table2 B on A.Name=B.Name and A.Start >= B.Start and A.End < B.End
group by Name, B.Start, B.End