2014-12-15 7 views
-3

Я пытался написать этот сложный запрос, где я должен вычислить общее количество FTE по профессиям по годам. Так, например, в org1 за 2011 год у нас есть 2 DataEntryC, общая сумма FTE = 50,95 + 70,95, но теперь я также должен добавить 20% административного персонала, работающего на org1 в 2011 году на FTE. И эта последняя цифра была бы общей суммой FTE для ввода данных. В основном в рамках организации в год общий персонал FTE = все сотрудники FTE + 20% административного персонала FTE. Так, за 2011 год при вводе данных Org1 кларк должны иметь 141,90 FTE (50,95 + 70,95 +20)SQL SERVER 2008 рассчитанный запрос поля

enter image description here Я написал запрос, как показано ниже, но это только работа, когда есть только одна организация перечислила 2 профессии , Я думаю, что selfjoin может быть ответом ......

update test 
     set calculated_adjustment= (select calculated_adjustment from test where profession='Admin') 
     where profession='DataEntryC' 

Сценарии:

CREATE TABLE [dbo].[test](
    [year] [varchar](5) NULL, 
    [org_name] [varchar](10) NULL, 
    [profession] [varchar](10) NULL, 
    [fte] [float] NULL, 
    [calculated_adjustment] [float] NULL 
) 
GO 


GO 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2011', N'org1', N'DataEntryC', 50.95, NULL) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2011', N'org1', N'DataEntryC', 70.95, NULL) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2011', N'org1', N'Admin', 200, 20) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2011', N'org2', N'Admin', 150, NULL) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2012', N'org1', N'DataEntryC', 20, NULL) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2012', N'org2', N'Admin', 15, NULL) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2011', N'org1', N'Support', 50, NULL) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2011', N'org1', N'Support', 100, NULL) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2012', N'org2', N'Support', 200, NULL) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2012', N'org2', N'Admin', 150, NULL) 

на 2011 год в Org1 вводе данных кларк должен иметь 141,90 FTE

+0

Если вы указали небольшой сценарий SQL, чтобы настроить таблицу с данными примера, которые вы показали, кто-то может попробовать ответить. –

+0

Добавили скрипт. Большое спасибо за предложение помочь. – user3844877

+0

Ах, я не сказал * I * мог бы помочь, но это облегчит работу, если кто-то, кто умеет SQL, хочет ответить;) –

ответ

0

Ваши данные образцов не были достаточно для меня, чтобы я считал, что у меня был ответ (т. е. это все еще может быть неправильным), поэтому я использовал эти данные:

INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2011', N'org1', N'DataEntryC', 50.95, NULL) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2011', N'org1', N'DataEntryC', 70.95, NULL) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2011', N'org1', N'Admin', 200, 20) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2011', N'org2', N'Admin', 150, NULL) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2012', N'org1', N'DataEntryC', 20, NULL) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2012', N'org2', N'Admin', 15, NULL) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2011', N'org1', N'Support', 50, NULL) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2011', N'org1', N'Support', 100, NULL) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2012', N'org2', N'Support', 200, NULL) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2012', N'org2', N'Admin', 150, 15) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2012', N'org2', N'DataEntryC', 73.27, NULL) 
INSERT [dbo].[test] ([year], [org_name], [profession], [fte], [calculated_adjustment]) VALUES (N'2012', N'org2', N'DataEntryC', 20, NULL) 

Тогда я сделал некоторые исследования и придумал:

;WITH x (yr, prof, org, fteSum) AS 
(
SELECT DISTINCT 
    T.year AS yr 
    , T.profession AS prof 
    , T.org_name AS org 
    , SUM(T.fte) OVER (PARTITION BY T.year) 
     + 
     (
     SELECT SUM(COALESCE(calculated_adjustment, 0)) 
     FROM test 
     WHERE T.year = year 
     AND T.org_name = org_name 
     AND profession = 'Admin' 
     ) AS fteSum 
FROM test AS T 
JOIN test AS S 
ON S.year = T.year 
WHERE T.profession = 'DataEntryC' 
GROUP BY T.year, T.org_name, T.fte, T.profession 
) 

--select yr, prof, org, fteSum FROM x 

UPDATE test 
SET calculated_adjustment = x.fteSum 
FROM x 
where test.year = x.yr 
AND test.org_name = x.org 
AND test.profession = 'DataEntryC' 

, который дает

year org_name profession fte calculated_adjustment 
2011 org1 DataEntryC 50.95 141.9 
2011 org1 DataEntryC 70.95 141.9 
2011 org1 Admin 200 20 
2011 org1 Support 50 NULL 
2011 org1 Support 100 NULL 
2011 org2 Admin 150 NULL 
2012 org1 DataEntryC 20 NULL 
2012 org2 Admin 15 NULL 
2012 org2 Support 200 NULL 
2012 org2 Admin 150 15 
2012 org2 DataEntryC 73.27 128.27 
2012 org2 DataEntryC 20 128.27 

Какой может быть результат вы после этого.

Обратите внимание, что вы выбрали SELECT. Это то, что я использовал, чтобы убедиться, что WITH thingy (a.k.a. временный названный результирующий набор, известный как общий табличный оператор (CTE)) возвращал правильный результат, метод, который я почерпнул из answer by Aaron Bertrand.

Смежные вопросы