在SQL Server中将聚合添加为新列

时间:2016-12-05 16:21:34

标签: sql sql-server

我想根据聚合结果创建一个新列。例如,输入数据(从here借来)如下:

Company  Date   Flag
------- ------- -----
001      201201  Y
001      201201  N
001      201202  N
001      201202  N
001      201202  Y

我想要的输出是

Company  Date   Flag  Percentage
------- ------- ----- ----------
001      201201  Y       0.5
001      201201  N       0.5
001      201202  N       0.66
001      201202  Y       0.66
001      201202  Y       0.66

也就是说,我需要根据CompanyDate将聚合(标记列中的Y百分比)加回原始表。

请注意,这只是玩具数据。在我的实际工作中,我必须加入许多表来获得所需的表并找到一些聚合。我做的是如下:

SELECT * 
FROM (
    /* Lots of joins go here to obtain Table A */
) AS A
JOIN (
    SELECT Percentage
    FROM (
       /* Percentage aggregation from Table A */
    ) AS P 
) AS B
ON A.xxx = B.xx

问题是我在计算聚合Percentage时必须再次生成表A.是否可以将聚合连接回所需的表而无需重新生成所需的表两次?感谢。

1 个答案:

答案 0 :(得分:2)

旗帜百分比= Y

Declare @YourTable table (Company varchar(25),Date int, Flag varchar(25))
Insert Into @YourTable values
('001',201201,'Y'),
('001',201201,'N'),
('001',201202,'N'),
('001',201202,'N'),
('001',201202,'Y')

Select *
      ,Pct = cast(sum(case when Flag='Y' then 1.0 else 0 end) over (Partition By Company,Date)/count(*) over (Partition By Company,Date) as decimal(10,2))
 From  @YourTable

返回

Company Date    Flag    Pct
001 201201      Y       0.50
001 201201      N       0.50
001 201202      N       0.33
001 201202      N       0.33
001 201202      Y       0.33
相关问题