【问题标题】:I need to get the percentage of sum of grouped rows using SQL DB2我需要使用 SQL DB2 获取分组行总和的百分比
【发布时间】:2021-08-02 15:42:27
【问题描述】:

下表:

AccountNo Symbol Amount
A1 IBM 10
A1 CSCO 20
A1 GOOG 30
A2 IBM 40
A2 FB 10

我需要获取帐户 A1 上的 IBM 百分比。即 10 * 100 / 60 = 16.6%

我需要获取帐户 A1 上 CSCO 的百分比。即20 * 100 / 60 = 33.33%

我需要获取帐户 A1 上的 GOOG 百分比。即30 * 100 / 60 = 50 %

我需要获取帐户 A2 上 IBM 的百分比。即40 * 100 / 50 = 80%

我需要获取帐户 A2 上的 FB 百分比。即10 * 100 / 50 = 20%

我尝试了以下查询但没有执行:

select AccountNo, SYMBOL, Value, Float(cast((value(Amount,0)) as DECIMAL(18,2))) / FLOAT(cast((value(t2.total,0)) as DECIMAL (18,2))) * 100
from mytable 
(select sum(Amount) as total from mytable group by AccountNo) as T2
where Amount > 0
group by AccountNo, SYMBOL, Value, T2.total;

【问题讨论】:

  • 你的 db2 平台和版本是什么?

标签: sql db2


【解决方案1】:

你可以使用窗口函数:

select account, symbol,
       amount * 100.0 / sum(amount) over (partition by account) as percentage
from t;

如果amount 实际上是聚合中的计算,您可以将其直接合并到聚合查询中。例如:

select account, symbol,
       sum(amount) * 100.0 / sum(sum(amount)) over (partition by account) as percentage
from t
group by account, symbol;

【讨论】:

  • 谢谢 Gordon!,我按照建议更新了查询,但出现错误:错误:不允许超过条款。
  • @VinayKiran 。 . .这是一个 dbfiddle,显示该语法在 db2 中有效:dbfiddle.uk/….
【解决方案2】:

在 Db2 for LUW 中有一个方便的函数 RATIO_TO_REPORT:

WITH T (AccountNo, Symbol, Amount) AS
(
VALUES
  ('A1', 'IBM',  10)
, ('A1', 'CSCO', 20)
, ('A1', 'GOOG', 30)
, ('A2', 'IBM',  40)
, ('A2', 'FB',   10)
)
SELECT 
  T.*
, DEC (100 * RATIO_TO_REPORT (Amount) OVER (PARTITION BY AccountNo), 5, 2) R
FROM T;

dbfiddle 链接。

【讨论】:

    猜你喜欢
    • 2020-10-19
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 2014-05-07
    相关资源
    最近更新 更多