查找某个部分的收费比该部分的平均成本高的供应商的价格(在所有提供该部分的供应商中平均)

时间:2019-01-18 23:22:41

标签: sql select db2

我有一个表目录,我应该找到一些供应商的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;

2 个答案:

答案 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更快。