2016-12-05 3 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 в Флаг) вернуться к исходной таблице на основе Company и Date.

Обратите внимание, что это только данные о игрушке. В моей реальной работе я должен присоединиться к множеству таблиц, чтобы получить желаемый и найти некоторые скопления. То, что я сделал, как следующее:

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. Можно ли присоединиться к агрегации обратно в нужную таблицу без повторной регенерации нужной таблицы? Благодарю.

+0

вы могли бы сделать отборный т. * Из (ваш весь запрос здесь) т и чем у вас есть доступ ко всем полям с т без необходимо что-то обновить – GuidoG

+0

Есть ли какая-то конкретная причина, почему вы не создаете представление, основанное на ваших таблицах? – Tyron78

+2

Довольно уверен, что вы выполняете то, что вам нужно, с помощью [функций окна] (https://msdn.microsoft.com/en-us/library/ms189461.aspx), например. 'Percentage = 1.0/COUNT (*) OVER (PARTITION by Company, Date)' – 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. Только небольшой поворот к его оригинальному комментарию –