2015-10-14 63 views
0

我下表SUM和SUBTRACT和连接表

表名称EmployeeInformation

EmployeeID EmployeeFirstName EmployeeLastName 
    1    |John  |Baker 
    2    |Carl  |Lennon 
    3    |Marion |Herbert 

表名称PeriodInformation

PeriodID PeriodStart PeriodEnd 
    1 |1/1/14  |12/30/14 
    2 |1/1/15  |12/30/15 

表名LeaveType有

LeaveTypeID LeaveTypeName 
    1  |Annual Leave 
    2  |Sick Leave 

表名LeaveEntitlment

SNO LeaveTypeID PeriodID EmployeeID LeaveEntitlementDaysNumber 
1 |  1 | 1 |  1 |   10 
2 |  1 | 1 |  1 |   15 
3 |  2 | 1 |  1 |   15 
4 |  2 | 2 |  1 |   5 
5 |  1 | 2 |  2 |   10  
6 |  1 | 2 |  2 |   10 
7 |  1 | 2 |  2 |   15 
8 |  2 | 2 |  2 |   15 
9 |  2 | 2 |  2 |   5 
10 |  1 | 1 |  2 |   10 

表名AssigneLeave

SNO LeaveTypeID PeriodID EmployeeID AssignedLeaveDaysNumber 
1 |  1 | 1 |  1 |   10 
2 |  1 | 1 |  1 |   10 
3 |  2 | 1 |  1 |   5 
4 |  2 | 2 |  1 |   5 
5 |  1 | 2 |  2 |   2  
6 |  1 | 2 |  2 |   3 
7 |  1 | 2 |  2 |   4 
8 |  2 | 2 |  2 |   8 
9 |  2 | 2 |  2 |   5 
10 |  1 | 1 |  2 |   9 

我想查询加入基于基于LeaveTypeIDLeaveEntitlement.LeaveEntitlementDaysNumberEmployeeIDPeriodIDLeaveTypeID

和所有这个表作为EntitleAnnaul和AS EntitleSick 及和AssignedLeave.AssignedLeaveDaysNumber基于LeaveTypeID AS AssignedAnnaul和AS AssignedSick 和减去AssignedAnnualEntitleAnnaul基于LeaveTypeID AS AnnualBalance 和基于LeaveTypeID AS SickBalance

查询应显示以下列从AssignedSick减去EntitleSick

EmployeeID, 
EmployeeFirstName, 
EmployeeLastName, 
PeriodID, 
PeriodStart, 
PeriodEnd, 
EntitleAnnual, 
AssignedAnnual, 
AnnualBalance, 
EntitleSick, 
AssignedSick, 
SickBalance 
+0

欢迎使用计算器。请阅读[问]。 –

回答

0

尝试下面的查询(在子查询中使用group进行聚合,然后在外部查询中进行计算),使用正常连接假设d ata存在于所有表中,如果不是,那么您将不得不修改查询以使用左/右外连接

select 
    SubQry.EmployeeID, 
    SubQry.EmployeeFirstName, 
    SubQry.EmployeeLastName, 
    SubQry.PeriodID, 
    SubQry.PeriodStart, 
    SubQry.PeriodEnd, 
    SubQry.EntitleAnnual, 
    SubQry.AssignedAnnual, 
    (SubQry.EntitleAnnual-SubQry.AssignedAnnual) as AnnualBalance, 
    SubQry.EntitleSick, 
    SubQry.AssignedSick, 
    (SubQry.EntitleSick-SubQry.AssignedSick) as SickBalance 
From 
(
Select 
    ei.EmployeeID, 
    ei.EmployeeFirstName , 
    ei.EmployeeLastName, 
    pi.PeriodID, 
    pi.PeriodStart, 
    pi.PeriodEnd, 
    Sum(Case when lt.LeaveTypeID = 1 Then le.LeaveEntitlementDaysNumber Else 0 End) as EntitleAnnual, 
    Sum(Case when lt.LeaveTypeID = 1 Then al.AssignedLeaveDaysNumber Else 0 End) as AssignedAnnual, 
    Sum(Case when lt.LeaveTypeID = 2 Then le.LeaveEntitlementDaysNumber Else 0 End) as EntitleSick, 
    Sum(Case when lt.LeaveTypeID = 2 Then al.AssignedLeaveDaysNumber Else 0 End) as AssignedSick 
From (select EmployeeID,LeaveTypeID,PeriodID,sum(LeaveEntitlementDaysNumber) as LeaveEntitlementDaysNumber from LeaveEntitlment group by EmployeeID,LeaveTypeID,PeriodID) le 
join (select EmployeeID,LeaveTypeID,PeriodID,sum(AssignedLeaveDaysNumber) as AssignedLeaveDaysNumber from AssigneLeave group by EmployeeID,LeaveTypeID,PeriodID) al on le.EmployeeID = al.EmployeeID and le.LeaveTypeID = al.LeaveTypeID and le.PeriodID = al.PeriodID 
join EmployeeInformation ei on ei.EmployeeID = le.EmployeeID 
join PeriodInformation pi on pi.PeriodID = le.PeriodID 
join LeaveType lt on lt.LeaveTypeID = le.LeaveTypeID 
group by ei.EmployeeID,ei.EmployeeFirstName,ei.EmployeeLastName,pi.PeriodID,pi.PeriodStart,pi.PeriodEnd 
) SubQry 
+0

谢谢narendra我做了同样的指示,但是当我执行结果是错误的。 – AliSher

+0

你会得到什么错误? – narendra

+0

例如在EntitleAnnual它应该检索65的总和,但它检索325和AssignedAnnual它应该检索59的总和,但它检索118和另外两列以及。我不知道是什么问题? – AliSher