SQL - Группировка и агрегация для расчета отношения по отношению к итогу - PullRequest
0 голосов
/ 07 января 2020

Моя таблица выглядит следующим образом:

продукт предложение

Product1 O1

Product1 O1

Product1 O2

Product2 O3

Product2 O4

Где продукт - это продукт, указанный на веб-сайте, а предложение - это предложение для продукта, просмотренного клиентом.

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

Товар Предложение ViewPercentage

Product1 O1 67%

Product1 O2 33%

Product2 O3 50%

Product2 O4 50%

Ответы [ 3 ]

2 голосов
/ 07 января 2020

Вы можете использовать функции окна для вычисления процента просмотра для каждого предложения:

SELECT DISTINCT product, offer,
     100.0 * (COUNT(*) OVER (PARTITION BY product, offer)) / (COUNT(*) OVER (PARTITION BY product)) AS ViewPercentage
FROM offers
1 голос
/ 07 января 2020

Использовать агрегирование с оконными функциями:

SELECT product, offer,
       COUNT(*) / SUM(COUNT(*)) OVER (PARTITION BY producct) as ViewRatio
FROM offers
GROUP BY product, offer;

Примечание. При этом получается соотношение между 0 и 1, а не значение между 0 и 100. Вы можете умножить на 100, если действительно хотите. И даже конвертировать в строку с %, если это необходимо.

1 голос
/ 07 января 2020

В Oracle 11g и далее RATIO_TO_REPORT - это аналитическая функция c, которая может быть полезна здесь.

Смотрите здесь.

SELECT product,
  offer,
  round(RATIO_TO_REPORT(cnt) over(partition by  product ) * 100 ) AS "%" 
FROM 
 ( SELECT product,
          offer,
           COUNT(offer) cnt 
   FROM tab
    GROUP BY product, offer);
...