对查询中返回的所有行求和,并在每行中使用它

时间:2018-06-12 19:08:50

标签: sql oracle

我有一个查询(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 :(得分:1)

您使用dates <- c("05/10/1983","8/17/2014","1953-12","1975","2001-06-17") parse_date_time(dates, orders = c("%m/%d/%Y","%Y-%m","%Y","%Y-%m-%d")) [1] "1983-05-10 UTC" "2014-08-17 UTC" "1953-12-01 UTC" "1975-01-01 UTC" "2001-06-17 UTC" 获取总数:

SUM OVER

至于复杂性:我无法回答这个问题。 DBMS必须遍历结果,构建总计并计算每行的百分比。