2015-08-17 7 views
1

У меня есть запрос, который заполняет отчет о «списании» часов, общая сумма которого представляет собой сумму RegHrs, OvtHrs и SpecialOvtHrs, но только те значения с положительным значением (каждый из эти поля могут иметь положительные и отрицательные значения - положительные значения «списываются»).Проблема с суммами и с условием наличия

Запрос Я использую (который не работает) является:

select 
    LD.Employee, 
    max(EM.LastName + ', ' + Em.FirstName) as EMName, 
    LD.WBS1, LD.WBS2, 
    sum(LD.RegHrs + LD.OvtHrs + LD.SpecialOvtHrs) as [Hours], 
    CL.Name as ClientName, pctf.CustProgram, 
    max(PR.Name) as ProjName, 
    LD.PKey, ISNULL(BillingDirectives.Comment, 'None') 
from AnvilProd..LD 
left join AnvilProd..PR on LD.WBS1 = PR.WBS1 and PR.WBS2 = ' ' and PR.WBS3 = ' ' 
left join AnvilProd..EM on LD.Employee = EM.Employee 
left join AnvilProd..CL on PR.ClientID = CL.ClientID 
left join AnvilProd..ProjectCustomTabFields pctf on PR.WBS1 = pctf.WBS1 and pctf.WBS2 = ' ' and pctf.WBS3 = ' ' 
left join InterfaceDev..BillingDirectives on BillingDirectives.PKey = LD.PKey 
where LD.BillStatus = 'X' 
and LD.WrittenOffPeriod = @custPeriod 
and LD.WBS1 not in (select distinct WBS1 from AnvilProd..BT where FeeBasis = 'L') 
and LD.WBS1 not in (select distinct WBS1 from InterfaceDev..CircledHoursReportEliminatedJobs where ActiveStatus = 'Active') 
group by pctf.CustProgram, CL.Name, LD.WBS1, LD.WBS2, LD.Employee, BillingDirectives.Comment, LD.PKey 
-- having ((sum(LD.RegHrs) > 0) or (sum(LD.OvtHrs) > 0) or (sum(LD.SpecialOvtHrs) > 0)) 
order by pctf.CustProgram, CL.Name, LD.WBS1, WBS2, EMName 

Мне нужно найти списанные часов для каждого сотрудника, WBS1, WBS2 комбинации.

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

ответ

1

Используйте case внутри sum():

select blah, blah, 
    sum(
    case when LD.RegHrs > 0 then LD.RegHrs else 0 end + 
    case when LD.OvtHrs > 0 then LD.OvtHrs else 0 end + 
    case when LD.SpecialOvtHrs > 0 then LD.SpecialOvtHrs else 0 end 
) as [Hours], blah, blah 
from blah join blah ... 
group by blah, blah 
-- no having clause 

В качестве математического любопытства, вы можете также код на сумму таким образом:

sum((LD.RegHrs + abs(LD.RegHrs) + 
    (LD.OvtHrs + abs(LD.OvtHrs) + 
    (LD.SpecialOvtHrs + abs(LD.SpecialOvtHrs))/2 

который, хотя и является немного менее читабельным, он использует меньше кода и может поразить своих коллег больше :)

+0

О, мой ... это красивый подход, который даже не произошел со мной. Вот почему я люблю StackOverflow! Спасибо, богемский. – DJGray

+0

Редактирование решения выше. Я должен сказать, когда RegHrs <> 0, а не> 0, потому что я должен также включать отрицательные значения. – DJGray

+0

@ DJGray только для RegHrs? Остальные только положительные? У вашей попытки предложения есть 'sum (LD.RegHrs)> 0', предполагая, что только положительный фильтр применяется ко всем 3 – Bohemian

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