У меня есть запрос (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) лучший случай.