如何避免SQL查询中的重复计数

时间:2018-04-21 05:42:06

标签: sql

我有两张桌子。

X ,其中列为Productid,Subproductid和Price。

Y ,列为Productid,Subproductid和Weight。

数据如下:

表X:

+-----------+--------------+-------+
| Productid | Subproductid | Price |
+-----------+--------------+-------+
| ProductA  | s1           |     4 |
| ProductA  | s1           |     6 |
| ProductA  | s2           |    12 |
| ProductA  | s2           |     8 |
| ProductB  | s1           |     3 |
| ProductB  | s1           |     2 |
| ProductB  | s2           |     6 |
| ProductA  | s2           |     5 |
+-----------+--------------+-------+

表Y:

+-----------+--------------+--------+
| Productid | Subproductid | Weight |
+-----------+--------------+--------+
| ProductA  | s1           |      3 |
| ProductA  | s2           |      5 |
| ProductB  | s1           |      4 |
| ProductB  | s2           |      1 |
+-----------+--------------+--------+

对于每种产品,我使用加权价格SQL作为:

Select X.Productid, sum(X.price * Y.weight)/sum(Y.weight)
    from X,Y
    where X.Productid = Y.Productid
    And X.SubProductid = Y.SubProductid
Group by X.productid

但是通过使用上面的查询,我重复计算表Y实例。

我想要输出如下

对于ProductA : 加权价格为(4 * 3 + 6 * 3 + 12 * 5 + 8 * 5)/(3 + 5)= 16.5

对于ProductB : 加权价格为(3 * 4 + 2 * 4 + 6 * 1 + 5 * 1)/(4 + 1)= 6.2

如何在不重复计算表Y行的情况下编写查询以获得上述结果?

2 个答案:

答案 0 :(得分:0)

另外加入子查询,从sum()选择Y

SELECT X.Productid,
       sum(X.Price * Y.Weight)/Y_s.Weight
       FROM X
            INNER JOIN Y
                       ON Y.Productid = X.Productid
                          AND Y.SubProductid = X.Subproductid
            INNER JOIN (SELECT Productid,
                               sum(Weight) Weight
                               FROM Y
                               GROUP BY Productid) Y_s
                       ON X.Productid = Y_s.Productid
       GROUP BY X.productid;

鉴于OP中存在错误,X的示例数据的最后一行应该读取

| ProductB  | s2           |     5 |

| ProductA  | s2           |     5 |

这给出了

+----------+-------+
| ProductA | 16.25 |
| ProductB |  6.20 |
+----------+-------+

,正是你想要的(OP中有另一个错误为(4 * 3 + 6 * 3 + 12 * 5 + 8 * 5)/(3 + 5)= 16.25!= 16.5。)

答案 1 :(得分:0)

使用始终明确的join语法,可以更容易阅读和写入。

您需要subqueryjoins一起使用weight

select x.Productid, 
       (1.0 * sum(x.price * y.weight) / 
       (select sum(weight) from y where Productid = x.Productid)) as WeightedPrice         
from x 
inner join y on y.Productid = x.Productid and 
                y.SubProductid = x.SubProductid
group by x.Productid;