首页 > 解决方案 > SQL中基于计数的全连接和均匀分布

问题描述

我有两个要加入的表:

表 A

  Date     Gran1     Gran2     Gran3 
1/1/18         A         B        CD
1/1/18         A         B        EF
1/2/18         A         B        GF
1/2/18         A         B        EF
1/2/18         A         B        FR
1/2/18         A         L        EF

表 B

  Date     Gran1     Gran2     Value1    Value2
1/1/18         A         B        100       150
1/2/18         A         B        200        80
1/2/18         A         L        500        30

表 B 的粒度与表 A 不同。我想将表 B 加入表 A 并通过发生日期、Gran1 和 Gran2 的出现次数分配我加入的值。

我的最终结果应该是这样的:

  Date     Gran1     Gran2     Gran3    Value1     Value2
1/1/18         A         B        CD        50         75
1/1/18         A         B        EF        50         75
1/2/18         A         B        GF     66.67      26.67  
1/2/18         A         B        EF     66.67      26.67
1/2/18         A         B        FR     66.67      26.67
1/2/18         A         L        EF       500         30

任何帮助都会很棒,谢谢!

标签: sqlsql-serverjoin

解决方案


你可以试试这个查询

Select a1.date1, 
        a1.gran1, 
        a1.gran2,
        a1.gran3,
        (b.value1/a2.xCount) as value1, 
        (b.value2/a2.xCount) as value2
from @tableA A1
Inner join @tableB B on A1.date1 = B.date1 
                    and a1.gran1 = b.gran1 
                    and a1.gran2 = b.gran1
inner join (select date1, gran1, gran2, count(*) xCount 
                from  @tableA 
                group by date1, gran1, gran2) A2 on A1.date1 = A2.date1 
                                                and a1.gran1 = a2.gran1 
                                                and a1.gran2 = a2.gran2

推荐阅读