首页 > 解决方案 > 获取 SQL 中列的总和 - 列不是直接来自表,而是已计算

问题描述

我正在用 SQL 构建一个表,并有一个名为“DMA_FEE”的列,这是我从现有表中引入的其他 2 个列相乘的结果。我看到的任何关于对列中的所有值求和的语法都有一个“来自表”的部分,例如 SELECT SUM(column_name) FROM table;

考虑到我已经计算了这个有问题的列,它不是来自表,所以我不能使用这种语法,也看不到任何其他解决方案。到目前为止,这是我的列代码,最后一个是我得到 DMA_FEE 计算的地方。

SELECT A.*,
A.TRANSACTION_ID,
B.AMOUNT,
B.CHARGE_ID,
C.CHARGE_TYPE_ID,
D.CHARGE_GROUP,
E.ACCOUNT_NAME,
F.SIG_ENTITY_LABEL,
E.TRADING_USERID,
E.EXCHANGE_ID,
E.TRADEABLE_INSTR_NAME,
G.INSTR_SUBTYPE_LABEL,
G.UNDERLYING_SYM_BLOOMBERG,
G.FUT_EXPIRATION_DATE,
E.TRADE_DATE,
timestamp_table.timeformated,
A.RATE * A.BASIS_VALUE DMA_FEE
FROM REPLDOADM.IRE_ESTIMATE_TRANS_MAP A
LEFT JOIN REPLDOADM.IRE_CHARGES_ESTIMATE B ON A.ESTIMATE_ID = B.ESTIMATE_ID
LEFT JOIN REPLDOADM.IRE_CHARGES_LU C ON B.CHARGE_ID = C.CHARGE_ID
LEFT JOIN REPLDOADM.ire_charge_types_lU D ON C.CHARGE_TYPE_ID = D.CHARGE_TYPE_ID
LEFT JOIN REPLDOADM.VW_IRE_TRADE_TRANSACTIONS E ON A.TRANSACTION_ID = E.TRANS_ID
LEFT JOIN (
SELECT to_char(create_ts, 'HH24:MI:SS') as timeformated, TRANS_ID
FROM REPLDOADM.VW_IRE_TRADE_TRANSACTIONS) timestamp_table ON (A.TRANSACTION_ID = 
timestamp_table.TRANS_ID)
LEFT JOIN REPLDOADM.VW_IRE_ACCOUNTS F ON E.ACCOUNT_NAME = F.PB_ACCOUNT_NAME
LEFT JOIN stig_adm.INSTRUMENT_UNIVERSE G ON E.TRADEABLE_INSTR_NAME = G.SHORT_NAME
WHERE timeformated >= '07:00:00' AND timeformated <= '18:00:00'
AND FUT_EXPIRATION_DATE >= add_months( trunc(sysdate), -12)

想法?

标签: sqloracle

解决方案


如果要显示与其他列一起重复的所有 DMA_FEE 值的总和,请添加SUM(A.RATE * A.BASIS_VALUE) OVER () as DMA_FEE_TOTAL到 SELECT 子句。这是 SUM() 的分析窗口函数版本。

如果您只想单独计算总数,则可以将整个查询包装在括号中并将其视为表格(这称为内联视图):

select SUM(DMA_FEE)
from (YOUR ENTIRE QUERY);

如果您想要其他内容,请编辑您的问题以添加所需输出结果的示例。

- 编辑 -

是的,按一组列分组是很常见的。

对于窗口函数,它位于partition by子句中:

SUM(A.RATE * A.BASIS_VALUE) OVER (partition by TRADEABLE_INSTR_NAME, TRADING_USERID, UNDERLYING_SYM_BLOOMBERG) as DMA_FEE_TOTAL

对于聚合函数,它放在一个group by子句中。请注意,当您有一个group by子句时,您的所有 SELECTed 列都需要是(a)按列分组,或(b)聚合函数,如 SUM()

select TRADEABLE_INSTR_NAME, 
  TRADING_USERID, 
  UNDERLYING_SYM_BLOOMBERG, 
  SUM(DMA_FEE) as DMA_FEE_SUBTOTAL
from (YOUR ENTIRE QUERY)
group by TRADEABLE_INSTR_NAME, TRADING_USERID, UNDERLYING_SYM_BLOOMBERG;

推荐阅读