【发布时间】:2020-12-16 19:35:54
【问题描述】:
我的数据如下所示:
Trader Name | Currency_Code | Counterparty | Traded_Amount | Total_Traded_Volume | Baseline_Avg | Variance
Jules Winnfield | GBP | GOLD | 10000 | 30000 | 10000 | 0
Jules Winnfield | GBP | BARC | 8000 | 30000 | 11000 | -3000
Jules Winnfield | GBP | JPMORG | 12000 | 30000 | 9000 | +3000
Jules Winnfield | EUR | GOLD | 15000 | 27000 | 6000 | 21000
Jules Winnfield | EUR | BARC | 2000 | 27000 | 12500 | -10500
Jules Winnfield | EUR | JPMORG | 10000 | 27000 | 8500 | +1500
让我花一点时间简要解释一下这个数据集:
- 交易者在三个交易对手(例如在本例中为高盛、巴克莱和摩根大通)进行了总价值 30000 英镑的交易。
- 单个金额,即 £10000、£8000 和 £12000 是对单个交易本身执行的简单
sum()聚合,其中 £30000 通过使用OVER (PARTITION BY TRADER_NAME, CURRENCY_CODE)的另一个聚合获得 - baseline_average 计算与所有其他交易对手的平均交易量 - 例如Jules 与巴克莱的交易额为 8000 英镑,与其他交易对手(高盛和摩根大通)的平均交易量为 11000 英镑。方差是 traded_amount 和 baseline_average 之间的差异。
用于生成上述输出的代码是:
SELECT
OT.TRADER_NAME,
OT.CURRENCY_CODE,
OT.COUNTERPARTY,
SUM(OT.TRADED_AMOUNT) AS TRADED_AMOUNT,
SUM(OT.TRADED_AMOUNT) OVER (PARTITION BY OT.TRADER_NAME, OT.CURRENCY_CODE) AS TOTAL_TRADED_VOL,
(SUM(OT.TRADED_AMOUNT) OVER (PARTITION BY OT.TRADER_NAME, OT.CURRENCY_CODE)-
SUM(OT.TRADED_AMOUNT))/NULLIF(SUM(1) OVER (PARTITION BY OT.TRADER_NAME, OT.CURRENCY_CODE)-1),0)
AS BASELINE_AVG,
SUM(OT.TRADED_AMOUNT) - (SUM(OT.TRADED_AMOUNT) OVER (PARTITION BY OT.TRADER_NAME,
OT.CURRENCY_CODE)-SUM(OT.TRADED_AMOUNT))/NULLIF(SUM(1) OVER (PARTITION BY OT.TRADER_NAME,
OT.CURRENCY_CODE)-1),0) AS VARIANCE
FROM ORDERS_TRADES_DATA OT
GROUP BY OT.TRADER_NAME, OT.CURRENCY_CODE, OT.COUNTERPARTY, FX.FX_RATE
到目前为止一切顺利。只要我指定我感兴趣的货币,这使我能够对数据进行切片。但是,我现在想添加一个列,将交易者的整个交易量汇总为等值美元 - 本质上,每个用户的一个 traded_volume 以美元为一个窗口函数——我可以用它来分析。我将外汇汇率存储在单独的表中,并且可以应用联接。已尝试运行以下查询:
SELECT
OT.TRADER_NAME,
OT.CURRENCY_CODE,
OT.COUNTERPARTY,
SUM(OT.TRADED_AMOUNT) AS TRADED_AMOUNT,
SUM(OT.TRADED_AMOUNT) OVER (PARTITION BY OT.TRADER_NAME, OT.CURRENCY_CODE) AS TOTAL_TRADED_VOL,
(SUM(OT.TRADED_AMOUNT) OVER (PARTITION BY OT.TRADER_NAME, OT.CURRENCY_CODE)-
SUM(OT.TRADED_AMOUNT))/NULLIF(SUM(1) OVER (PARTITION BY OT.TRADER_NAME, OT.CURRENCY_CODE)-1),0)
AS BASELINE_AVG,
SUM(OT.TRADED_AMOUNT) - (SUM(OT.TRADED_AMOUNT) OVER (PARTITION BY OT.TRADER_NAME,
OT.CURRENCY_CODE)-SUM(OT.TRADED_AMOUNT))/NULLIF(SUM(1) OVER (PARTITION BY OT.TRADER_NAME,
OT.CURRENCY_CODE)-1),0) AS VARIANCE,
SUM(OT.TRADED_AMOUNT)/FX.FX_RATE AS TRADED_AMOUNT_USD,
SUM((SUM(OT.TRADED_AMOUNT)/FX.FX_RATE) AS TOTAL_TRADED_VOL_USD,
(SUM(OT.TRADED_AMOUNT)/FX.FX_RATE OVER (PARTITION BY OT.TRADER_NAME)-
SUM(OT.TRADED_AMOUNT)/FX.FX_RATE)/NULLIF(SUM(1) OVER (PARTITION BY OT.TRADER_NAME)-1),0)
AS BASELINE_AVG_USD,
SUM((SUM(OT.TRADED_AMOUNT)/FX.FX_RATE) - (SUM(OT.TRADED_AMOUNT)/FX.FX_RATE OVER (PARTITION BY
OT.TRADER_NAME)-SUM(OT.TRADED_AMOUNT)/FX.FX_RATE)/NULLIF(SUM(1) OVER (PARTITION BY
OT.TRADER_NAME)-1),0) AS VARIANCE_USD
FROM ORDERS_TRADES_DATA OT
LEFT JOIN FX_RATES_TABLE FX ON OT.CURRENCY_CODE = FX.ASSET_CURRENCY_CODE
GROUP BY OT.TRADER_NAME, OT.CURRENCY_CODE, OT.COUNTERPARTY, FX.FX_RATE
...当我收到错误时不起作用:
无法对包含聚合或子查询的表达式执行聚合函数。
我如何在这里实现我的目标?
【问题讨论】:
标签: sql sql-server aggregate-functions window-functions