【问题标题】:sql calculate running total and percentage for each groupsql计算每个组的运行总数和百分比
【发布时间】:2021-09-05 05:26:42
【问题描述】:

我正在使用 SQL Server 2017 根据每个 symbol、created_date 和 call_put 值计算一些列值。在这里,我只发布一个符号,即 PFE 作为示例,但我在真实桌子上有很多。看来我需要 windowing/pivoting 来计算百分比和总和。

当前查询,

select symbol, created_date ,call_put,sum(volume) as ContractCount,sum(premium) as totalamount
from options_flow of2  where symbol ='PFE' GROUP  by call_put,created_date,symbol

电流输出:

symbol|created_date|call_put|ContractCount|totalamount|
------+------------+--------+-------------+-----------+
PFE   |  2021-06-11|CALL    |         3087|     260754|
PFE   |  2021-06-11|PUT     |         2445|     167671|

预期输出:

symbol|created_date|CallContractCount|PutContractCount|calltotalamount|puttotalamount|CallsContractPercentage|PUTsContractsPercentage| TotalCount
------+------------+-----------------+----------------+---------------+---------------+---------------------------+------------------------------
PFE   | 2021-06-11 |    3087      |       2445        | 260754        |167671         | (3087 / (3087+2445))*100 | (2445 / (3087+2445))*100     | 3087+2445

我尝试过的:

SELECT 
       created_date, symbol,
       (SUM(CallsContractCount) / NULLIF (SUM(CallsContractCount) + SUM(PutsContractCount), 0) * 100) CallsContractPercentage,
       (SUM(PutsContractCount) / NULLIF (SUM(CallsContractCount) + SUM(PutsContractCount), 0) * 100) PUTsContractsPercentage,
       SUM(CallsTotalAmount) CallsTotalAmount , SUM(PUTstotalamount) PUTstotalamount,
       SUM(CallsContractCount) CallsContractCount,
       (SUM(CallsContractCount) + SUM(PutsContractCount)) TotalCount,
       SUM(PutsContractCount) PutsContractCount
FROM 
(
       select created_date, symbol,call_put ,
              CASE WHEN call_put = 'CALL' THEN volume ELSE 0 END CallsContractCount,
              CASE WHEN call_put = 'PUT' THEN volume ELSE 0 END PutsContractCount,
              CASE WHEN call_put = 'CALL' THEN premium ELSE 0 END CallsTotalAmount,
              CASE WHEN call_put = 'PUT' THEN volume ELSE 0 END PUTstotalamount
       from  options_flow
) t WHERE symbol = 'PFE'
GROUP BY created_date, symbol, call_put 

【问题讨论】:

  • 您正在按 call_put 分组,这将强制将它们放在 2 条单独的行中 - 如果您从分组中删除它,您会将它们放在一行中。

标签: sql sql-server pivot window-functions


【解决方案1】:

您可以使用带有附加逻辑的聚合:

select cs.*,
       (call_volume * 1.0 / (put_volume + call_volume)) as CallsContractPercentage,
       (put_volume * 1.0 / (put_volume + call_volume)) as PutContractPercentage,
       (put_volume + call_volume) as total_count
from (select symbol,
             sum(case when call_put = 'Call' then volume end) as call_volume,
             sum(case when call_put = 'Call' then premium end) as call_premium,
             sum(case when call_put = 'Put' then volume end) as put_volume,
             sum(case when call_put = 'Put' then premium end) as put_premium
      from options_flow of2
      where symbol ='PFE'
      group by created_date, symbol
     ) cs;

【讨论】:

  • (put_volume + call_volume) as total_count 放在外部查询上后,它可以工作了:) 非常感谢您的帮助
  • @AlwaysSunny 。 . .我不知道那是怎么发生的。它显然是为外部查询缩进的。叹息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多