计算单行占行总和的百分比 - Teradata SQL

时间:2017-02-03 00:50:26

标签: sql teradata

我正在尝试计算“qual”列中a的百分比对每个loc的总销售额。

loc | qual | sales 
- - - - - - - - - - - - 
us  |  a   |  1,000 
us  |  b   |  500 
gc  |  a   |  200
gc  |  b   |  400

所以我要找的答案是US = 66.66%(1,000 / 1,500)和gc = 33.33%(200/600)。所以返回结果将是....

loc | Pct 
us  | 66.66%
gc  | 33.33%

谢谢!

3 个答案:

答案 0 :(得分:1)

您需要条件聚合

select loc, 
   100.00
     * sum(case when qual = 'a' then sales else 0 end) -- only 'a' sales 
     / sum(sales) as Pct                               -- all sales
from tab
group by loc

根据您的需要更改100.00 *的精确度。

注意,除非sales的数据类型是FLOAT或NUMBER,否则必须先将100 *乘以然后除以。

答案 1 :(得分:0)

您可以使用聚合和窗口函数执行此操作:

select loc, count(*) as sales, sum(count(*)) over () as total_sales,
       count(*) / sum(1.0*count(*)) over () as sales_proportion
from t
group by loc;

如果sales实际上是一个整数,可能应该将其转换为浮点或十进制表示(你可以只乘以1.0)。

编辑:

糟糕,上面做了一些有用的事情,但不是OP要求的。这是最简单的方法:

select loc,
       avg(case when qual = 'a' then 1.0 else 0 end) as proportion_a
from t
group by loc;

答案 2 :(得分:0)

要计算百分比,您知道需要对loc进行求和。但是你不想按loc和聚合进行分组,因为这会破坏你要保留的表的部分内容,并将结果表内部连接到你在这里的表中......好吧,那里&#39 ; s必须更简单。这就是相关子查询的来源!您可以执行子选择,该子选择计算与表中的loc相关的销售额。以下代码应该为您提供所需的内容。

select  loc,
        sales * 100 / (
            select sum(sales)
            from my_table sq
            where sq.loc = t.loc
        ) as pct
    from my_table t
    where qual = 'a'

希望这有帮助!