Суммируйте все строки, возвращенные в запросе, и используйте его в каждой строке - PullRequest
0 голосов
/ 12 июня 2018

У меня есть запрос (Oracle), который показывает продажи каждого клиента по годам:

SELECT cmp.company_key
    , sum(CASE WHEN sd.date between TO_DATE('01-Jan-2010', 'dd-mm-yyyy') and TO_DATE('11-Jun-2010', 'dd-mm-yyyy') THEN sd.qty_ship * sd.unit_price END) AS year1sales
    , sum(CASE WHEN sd.date between TO_DATE('01-Jan-2011', 'dd-mm-yyyy') and TO_DATE('11-Jun-2011', 'dd-mm-yyyy') THEN sd.qty_ship * sd.unit_price END) AS year2sales
FROM sales_detail sd
INNER JOIN sales_header sh on sd.sales_header_key = sh.sales_header_key
INNER JOIN companies cmp on sh.company_key = cmp.company_key
GROUP BY cmp.company_key

Запрос производит это:

company_key | year1sales | year2sales
------------|------------|------------
       8687 |   21355.76 |   54326.45
         25 |    9375.41 |      12401
         34 |    6440.03 |   50349.27
        247 |   47355.93 |   77432.67
         83 |   15757.35 |   39999.12

Но мне также нужно, чтобы он вернулсязначение («TBI»), показывающее, какой процент продаж этой компании сравнивается с суммой всех других показателей продаж.

Так, для компании # 8687 это будет 21355.76 / sigma(year1 sales), что составляет 21355.76/100,284.48 = 21.3%.

Таким образом, результат будет:

company_key | year1sales | year1 TBI | year2sales | year1 TBI
------------|------------|-----------|------------|----------
       8687 |   21355.76 |     21.30 |   54326.45 |     23.17
         25 |    9375.41 |      9.35 |      12401 |      5.29
         34 |    6440.03 |      6.42 |   50349.27 |     21.47
        247 |   47355.93 |     47.22 |   77432.67 |     33.02
         83 |   15757.35 |     15.71 |   39999.12 |     17.06

И, очевидно, столбцы TBI будут суммироваться до 100%.

Как бы вы написали этот запрос?Кроме того, какова сложность времени для такой проблемы?Я думаю, что это O (N ^ 2) лучший случай.

1 Ответ

0 голосов
/ 12 июня 2018

Вы бы использовали SUM OVER, чтобы получить итоги:

select
  company_key,
  year1sales,
  year1sales / sum(year1sales) over() as year1tbi,
  year2sales,
  year2sales / sum(year2sales) over() as year2tbi
from
(
  SELECT cmp.company_key
      , sum(CASE WHEN sd.date between date '2010-01-01' and date '2010-06-11' THEN sd.qty_ship * sd.unit_price END) AS year1sales
      , sum(CASE WHEN sd.date between date '2011-01-01' and date '2011-06-11' THEN sd.qty_ship * sd.unit_price END) AS year2sales
  FROM sales_detail sd
  INNER JOIN sales_header sh on sd.sales_header_key = sh.sales_header_key
  INNER JOIN companies cmp on sh.company_key = cmp.company_key
  GROUP BY cmp.company_key
)
order by company_key;

Что касается сложности: я не могу ответить на этот вопрос.СУБД должна просмотреть результат, построить итоговые значения и рассчитать проценты на строку.

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