2016-12-05 38 views
0

我想基于聚合结果创建一个新列。例如,该输入数据(从here借入),如下:将聚合添加为SQL Server中的新列

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 

即,我需要加入聚合(Y的百分比标志列)返回到基于CompanyDate的原始表格。

请注意,这只是一个玩具数据。在我的真实工作中,我必须加入大量表格才能获得所需的表格并找到一些聚合。我所做的是这样的:

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 

的问题是,我将不得不重新生成表A计算聚集Percentage时。是否有可能将聚合连接回所需的表格而无需两次重新生成所需的表格?谢谢。

+0

你可以做一个选择T *从(整个此处查询)吨,比你有机会获得在t所有字段,而不得不重新生成任何东西 – GuidoG

+0

是否有任何特定的原因,为什么不创建一个基于您的表的视图? – Tyron78

+2

很确定你用[窗口函数](https://msdn.microsoft.com/en-us/library/ms189461.aspx)来完成你的工作,例如'百分比= 1.0/COUNT(*)OVER(分区公司,日期)' – GarethD

回答

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 
+0

非常感谢,约翰。这真的有帮助! –

+0

@AndersonZhu乐于助人。但是GarethD在他的评论中首先出现在那里。然后我们都了解了FLAG条件。他原来的评论只是一小段 –