我有一个表目录,我应该找到一些供应商的sid,这些供应商的某个部分的收费高于该部分的平均成本(在所有提供该部分的供应商中平均)
我的解决方案正在工作,我有一个问题,就是我要表示的方式。我想在结果中有一栏,显示的是所有提供该零件的供应商的平均成本。结果应该是:
sid pid cost avg_cost
----- ----- ------ ----------
s1 p8 11.70 10.71
s2 p3 0.55 0.52
s3 p8 12.50 10.71
这是我的结果:
sid pid cost
----- ----- ------
s1 p8 11.70
s2 p3 0.55
s3 p8 12.50
这是我所做的:
SELECT DISTINCT c.sid, c.pid, c.cost
FROM catalog AS c
WHERE c.cost > (SELECT avg(c1.cost) AS avg_cost
FROM catalog c1
WHERE c1.pid=c.pid)
GROUP BY c.sid, c.pid, c.cost;
答案 0 :(得分:1)
您可以将子查询转换为JOIN
,以便其结果在外部查询中可用:
SELECT c.sid, c.pid, c.cost, c1.avg_cost
FROM catalog AS c
INNER JOIN (SELECT pid, avg(cost) AS avg_cost FROM catalog GROUP BY pid) c1
ON c1.pid = c.pid
WHERE c.cost > c1.avg_cost
PS:在原始查询中,您不需要GROUP BY
,因为您没有在外部查询中使用聚合函数。另外,根据您的数据,您似乎可能不需要DISTINCT
功能。
答案 1 :(得分:1)
窗口函数(在DB2中称为OLAP函数)是一种非常方便的方法:
SELECT c.*
FROM (SELECt c.*, AVG(c.cost) OVER (PARTITION BY c.pid) as avg_cost
FROM catalog c
) c
WHERE cost > avg_cost;
窗口函数通常比等效的JOIN
/ GROUP BY
更快。