найти поставщиков, которые берут за какую-то часть больше, чем средняя стоимость этой части (в среднем по всем поставщикам, поставляющим эту часть) - PullRequest
0 голосов
/ 19 января 2019

У меня есть каталог таблиц, и я должен найти список поставщиков, которые взимают за какую-то часть больше, чем средняя стоимость этой части (в среднем по всем поставщикам, поставляющим эту часть)

Мое решение работаетЕдинственное, с чем у меня проблема, это то, как я хочу это представить.Я хочу иметь один столбец в результате, который показывает стоимость, усредненную по всем поставщикам, которые поставляют эту часть.Это должен быть результат:

  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 голосов
/ 19 января 2019

Оконные функции (называемые в 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 эквивалентов.

0 голосов
/ 19 января 2019

Вы можете превратить свой подзапрос в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...