sql 计算每个组的 运行 总数和百分比
sql calculate running total and percentage for each group
我正在使用 SQL server 2017 根据每个 符号、created_date 和 call_put 值计算一些列值。这里我只是 post 一个符号,即 PFE 作为例子,但我有很多真实的 table。看来我需要 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
您可以使用具有附加逻辑的聚合:
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;
我正在使用 SQL server 2017 根据每个 符号、created_date 和 call_put 值计算一些列值。这里我只是 post 一个符号,即 PFE 作为例子,但我有很多真实的 table。看来我需要 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
您可以使用具有附加逻辑的聚合:
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;