SQL中基于计数的完全连接和均匀分布

时间:2018-07-03 22:57:00

标签: sql sql-server join

我有两个要加入的表:

表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,并按出现的次数Date,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

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

2 个答案:

答案 0 :(得分:1)

您可以尝试此查询

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

答案 1 :(得分:0)

此查询有效吗?

SELECT a.date,
a.gran1,
a.gran2,
a.gran3,
b.value1/gran_count AS value1,
b.value2/gran_count AS value2
FROM table_a a
INNER JOIN table_b b
  ON (a.date = b.date
  AND a.gran1 = b.gran1
  AND a.gran2 = b.gran2)
INNER JOIN (
  SELECT date, gran1, gran2, count(*) AS gran_count
  FROM table_a
  GROUP BY date, gran1, gran2
) sub ON (a.date = sub.date
  AND a.gran1 = sub.gran1
  AND a.gran2 = sub.gran2);

我现在无法访问SQL,因此无法验证数据(即使我错过了语法内容),但是我试图查找日期/的每个组合的COUNT个在子查询中使用gran1 / gran2,然后在主查询的分区中使用它。

table_b和子查询(我称为“ sub”)都连接到table_a。

使用两个联接而不是三个联接来执行此查询可能是一种更有效的方法,但是现在没有任何想法。