简体   繁体   English

如何在没有 GROUP BY 子句的情况下使用 PARTITION BY

[英]How to user PARTITION BY without GROUP BY clause

I have a simple query where I need to sum up all Premium per policy Number.我有一个简单的查询,我需要总结每个保单编号的所有保费。 It gives me an error because I need to group it by Premium .它给了我一个错误,因为我需要按Premium对其进行分组。 Is any way to achieve this without grouping by "Premium"?有什么方法可以在不按“高级”分组的情况下实现这一目标?

Sample query:示例查询:

declare @Test table (PolicyNumber varchar(50), Coverage varchar(50), Premium money)
insert into @Test 
select 'Pol1' as PolicyNumber, 'Coverage1' as Coverage, 100 as Premium
UNION ALL select 'Pol1', 'Coverage2', 200 
UNION ALL select 'Pol1', 'Coverage2', 25 
UNION ALL select 'Pol1', 'Coverage3', 500 
UNION ALL select 'Pol1', 'Coverage4', 300 
UNION ALL select 'Pol1', 'Coverage4', 25 
UNION ALL select 'Pol1', 'Coverage5', 150 


select 
PolicyNumber,
Coverage,
SUM(Premium) as Premium,
-- this gives an error
PremiumPerPolicy = SUM(Premium) OVER (Partition by PolicyNumber)
from @Test
group by PolicyNumber, Coverage

The result should look like this结果应该是这样的

PolicyNumber    Coverage    Premium  PremiumPerPolicy
 Pol1          Coverage1     100       1300
 Pol1          Coverage2     225       1300
 Pol1          Coverage3     500       1300
 Pol1          Coverage4     325       1300
 Pol1          Coverage5     150       1300

You can aggregate your value normally and then aggerate again using a window function.您可以正常聚合您的值,然后使用 window function 再次聚合。

SUM(Premium) OVER (Partition by PolicyNumber)

becomes变成

SUM(SUM(Premium)) OVER (Partition by PolicyNumber)

Just pre-calculate your partition sum first.只需先预先计算您的分区总和。 I have also assumed that its possible to have multiple policy numbers (again not shown in your sample data).我还假设它可能有多个保单编号(同样未在您的示例数据中显示)。

with cte as (
    select
        PolicyNumber
        , Coverage
        , Premium
        , sum(Premium) over (partition by PolicyNumber) PremiumSum
    from @Test
)
select PolicyNumber, Coverage, sum(premium), PremiumSum
from cte
group by PolicyNumber, Coverage, PremiumSum;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM