【问题标题】:find the sids of suppliers who charge more for some part than the average cost of that part (averaged over all the suppliers who supply that part)找出对某部分收费高于该部分平均成本的供应商的 sids(对所有供应该部分的供应商进行平均)
【发布时间】:2019-01-18 23:22:41
【问题描述】:

我有一个表格目录,我应该找到对某些零件收费高于该零件平均成本(所有供应该零件的供应商的平均值)的供应商的 sids

我的解决方案是有效的,我唯一有问题的是我想要表达它的方式。我希望在结果中有一列显示提供该零件的所有供应商的平均成本。结果应该是这样的:

  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;

【问题讨论】:

    标签: sql select db2


    【解决方案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 功能。

    【讨论】:

      【解决方案2】:

      窗口函数(在 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 等价函数更快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-28
        • 1970-01-01
        • 2020-07-11
        • 2010-11-26
        • 1970-01-01
        • 2010-10-20
        • 2012-01-03
        • 2021-10-12
        相关资源
        最近更新 更多