我有两张桌子。
表 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行的情况下编写查询以获得上述结果?
答案 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
语法,可以更容易阅读和写入。
您需要subquery
与joins
一起使用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;