【问题标题】:Calculating % of single row to sum of rows - Teradata SQL计算单行占行总和的百分比 - Teradata SQL
【发布时间】:2017-02-03 15:45:17
【问题描述】:

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

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%

谢谢!

【问题讨论】:

    标签: sql teradata


    【解决方案1】:

    您可以使用聚合和窗口函数来做到这一点:

    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;
    

    【讨论】:

    • 谢谢!在使用您的解决方案时,我实际上意识到了一个错误。 “销售”列实际上有事务ID,所以我需要在每个位置的总事务中找到“a”的事务计数。这可能与计数有关吗?提前抱歉格式错误! select loc, count(transactionID) as Transactions, count(count(transactionID)) over () as TotalTransactions, count(transactionID)/ count(count(transactionID)) over () as total_proportion from t group by loc;
    • 没有。 . .你想要sum(count(TransactionId))
    • @Bocean 。 . .无论如何,我回答了错误的问题。查看编辑。
    【解决方案2】:

    你需要一个条件聚合

    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 *,然后再除。

    【讨论】:

      【解决方案3】:

      要计算百分比,您需要对 loc 求和。但是您不想按 loc 和聚合进行分组,因为这会破坏您想要保留的表的某些部分,并将生成的表内部连接回您在此处的表......好吧,必须有一个更简单的方法。这就是相关子查询的用武之地!您可以执行子选择来计算与表中 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'
      

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-08
        • 1970-01-01
        • 2021-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多