2015-12-17 10 views
0

Я пытаюсь написать отчет, который будет разделять общую сумму для каждого вкладчика на их основную учетную запись и их вторичную учетную запись на основе пределов основной учетной записи. Ниже приведен некоторый код для создания некоторых таблиц примеров, а также то, что у меня есть для кода, и нужный набор результатов, отображаемый внизу. Часть кода, который закомментирован, - это простой английский, о чем я не уверен, как кодировать.Разделение суммы между разными учетными записями

Я пытаюсь написать это на SQL Server 2012.

Create Table Test 

(
Empid Int not null, 
Account Varchar(25) not null, 
MaxAmt Int not null 
) 


Create Table Test2 

(
EmpID Int not null, 
TtlAmt int not null 
) 


Insert Into Test 
Values (748,'Primary',50) 

Insert Into Test 
Values (748,'Secondary',99999) 

Insert Into Test 
Values (750,'Primary',50) 

Insert Into Test 
Values (750,'Secondary',99999) 

Insert Into Test 
Values (752,'Primary',60) 

Insert Into Test 
Values (752,'Secondary',99999) 

Insert Into Test2 
Values (748,80) 

Insert Into Test2 
Values (750,75) 

Insert Into Test2 
Values (752,20) 

Select * from Test 

Select * from Test2 


Select 
    B.EmpID 
    ,A.Account 
    ,Case 
     When A.Account = 'Primary' and B.TtlAmt >= A.Maxamt Then A.MaxAmt 
     When A.Account = 'Primary' and B.TtlAmt <= A.MaxAmt Then B.TtlAmt 
     When A.Account = 'Secondary' and B.TtlAmt > /* Max of Primary */ Then B.TtlAmt - /* Max of Primary */ 
     When A.Account = 'Secondary' and B.TtlAmt <= /* Max of Primary */ Then Null 
     Else 'Error' 
    End as Amount 


From Test as A 
    Join Test2 as B 
     on A.EmpID = B.EmpID 


/*************** Desired Result would look like below *******************/ 

EmpID   Account    Amount 
748    Primary    50 
748    Secondary   30 
750    Primary    50 
750    Secondary   25 
752    Primary    20 
752    Secondary   Null 

Это начало, как будет в конечном итоге в общей сложности до 25 счетов максимум для каждого EmpId в то время как некоторые EmpID будут иметь только 1 .

ответ

1
Select 
    B.EmpID 
    ,A.Account 
    ,Case 
     When A.Account = 'Primary' and B.TtlAmt >= A.Maxamt Then A.MaxAmt 
     When A.Account = 'Primary' and B.TtlAmt <= A.MaxAmt Then B.TtlAmt 
     When A.Account = 'Secondary' and B.TtlAmt > A2.MaxAmt Then B.TtlAmt - A2.MaxAmt 
     When A.Account = 'Secondary' and B.TtlAmt <= A2.MaxAmt Then Null 
     Else 'Error' 
    End as Amount 


From Test as A 
    Join Test as A2 on A.EmpId = A2.EmpId and A2.Account = 'Primary' 
    Join Test2 as B 
     on A.EmpID = B.EmpID 

от комментариев ниже, Проще всего было бы, как этот

Select 
    B.EmpID 
    ,A.Account 
    ,sum(Case 
     When A.Account = 'Primary' and B.TtlAmt >= A.Maxamt Then A.MaxAmt 
     When A.Account = 'Primary' and B.TtlAmt <= A.MaxAmt Then B.TtlAmt 
     When A.Account = 'Secondary' and B.TtlAmt > A2.MaxAmt Then B.TtlAmt - A2.MaxAmt 
     When A.Account = 'Secondary' and B.TtlAmt <= A2.MaxAmt Then 0 
     Else 0 
    End) as Amount 


From Test as A 
    Join Test as A2 on A.EmpId = A2.EmpId and A2.Account = 'Primary' 
    Join Test2 as B 
     on A.EmpID = B.EmpID 
group by B.EmpID, A.Account 
+0

Это, как представляется, очень близко к а Мне нужно. Однако он дает 3 строки данных для каждой комбинации Empid/Account (748 Primary 3x и 748 Secondary 3x ...). Третья запись для Seconday на каждом Empid ниже, чем предыдущие, на 10, единственным исключением является Empid of 752 так как он вторичный был null –

+0

Моя ошибка, пропустил вашу вторую часть. Суммируйте поле Сумма (удалите ошибку) и группу с помощью EmpId и учетной записи, см. Править. – nikolifish

+0

Совершенство. Я все еще не совсем понимаю, как вы можете связать таблицу с самим собой, чтобы это произошло, но это довольно мило. Если я правильно интерпретирую это, мы делаем вывод, полученный через соединение, но только с основными учетными записями, чтобы мы могли захватить maxamt основной учетной записи, глядя на вторичную учетную запись из-за цепочки соединений на EMPID через B> A> A2. Не думайте, что я бы это так поблагодарил. –

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