2012-04-19 39 views
2

基本上我试图做的,有一个日期范围(月)内有适用的服务的用户使用SUM

我希望能够显示用户的可用时间的服务(在小时),以及有多少小时,他们已安排基础

所以我希望它基本上看起来像

user    service    available   scheduled 
----------------------------------------------------------------- 
User1   Service1   120    7 
User1   Service2   40    0 

的计划列通过采取SUMStart的计算,持有约会数据表和End字段在我的Appointment表中。

现在我的问题是,如果没有安排约会,我不确定如何仍然显示我想要的信息。

表之间的关系如下:每个用户

  • 1 NOA
  • 每NOA多业务
  • 1每服务FormType

  • 预约保持FormTypeID作为FK

  • ClientAppointment包含AppointmentID和UserID(与分配的NOA相同的用户)

SELECT 

--NOA 
noa.noaID, noa.userID as 'ClientUserID', 

--Service 
service.BillingCode + service.MOD1 + service.MOD2 + service.MOD3 + service.MOD4 AS  BillingCode, service.FormTypeID, service.StartDate, service.EndDate, service.CurrentUnits, service.Adjustment, 

--Scheduler 
scheduler.* 
FROM LEL_NOA noa 
LEFT JOIN LEL_Service service ON service.noaID = noa.noaID 
LEFT OUTER JOIN 
(
SELECT ca.ClientID, SUM(DATEDIFF(second, a.Start, a.[End])/3600) as ScheduledUnits  FROM LEL_Scheduler_Appointment a 
LEFT JOIN LEL_Scheduler_ClientAppointment ca ON a.ApptID = ca.ApptID 
WHERE a.Start BETWEEN '1/1/2012' and '1/31/2012' 
    AND a.[End] BETWEEN '1/1/2012' and '1/31/2012' 
GROUP BY ca.ClientID 

) AS scheduler ON noa.UserID = scheduler.ClientID 

WHERE noa.UserID = 4 
AND service.StartDate BETWEEN '1/1/2012' and '1/31/2012' 
AND service.EndDate BETWEEN '1/1/2012' and '1/31/2012' 

ORDER BY 'ClientUserID', BillingCode, FormTypeID, StartDate 

上述程序将会重新拉开大月,21 availabl,7计划,但有UserID = 4的人对那段时间的另一个服务和我想显示信息与0小时计划作为我的表中的下一个项目。


(noaID, ClientUserID, BillingCode, FormTypeID, StartDate, EndDate, CurrentUnits,  Adjustment, ScheduledUnits) VALUES 
(203, 25, 'x888', 6, '4/16/2012 4:24:19 PM', '4/16/2012 4:24:19 PM', 0, 0, 5.000000), 
(203, 25, 'x999', 1, '4/1/2012 12:00:00 AM', '4/30/2012 12:00:00 AM', 10, 0, 5.000000) 

的问题是,第一个条目,没有安排任何的约会,但但它仍然显示5(其中第二总和是正确的)

+0

你可以发布一些样本数据和所需的o/p吗? – Teja 2012-04-19 17:38:46

+0

添加到底部,INSERT格式 – dgarbacz 2012-04-19 18:42:51

回答

1

尝试重新处理您的查询以使用内联子查询。性能可能会受到影响,但获取正确的查询会更容易。

SELECT 
--NOA 
noa.noaID, noa.userID as ClientUserID, 
--Service 
service.BillingCode + service.MOD1 + service.MOD2 + service.MOD3 + service.MOD4 AS BillingCode, 
service.FormTypeID, service.StartDate, service.EndDate, service.CurrentUnits, service.Adjustment, 
--Scheduler 
(
    SELECT COALESCE(SUM(DATEDIFF(second, a.Start, a.[End])/3600), 0) as ScheduledUnits 
    FROM LEL_Scheduler_Appointment a 
     INNER JOIN LEL_Scheduler_ClientAppointment ca ON a.ApptID = ca.ApptID 
    WHERE a.Start BETWEEN '1/1/2012' and '1/31/2012' 
     AND a.[End] BETWEEN '1/1/2012' and '1/31/2012' 
     AND ca.ClientID = noa.UserID 
     AND a.ServiceID = FormTypeID 
) as ScheduledUnits 
FROM LEL_NOA noa 
    LEFT JOIN LEL_Service service ON service.noaID = noa.noaID 
WHERE noa.UserID = 4 
    AND service.StartDate BETWEEN '1/1/2012' and '1/31/2012' 
    AND service.EndDate BETWEEN '1/1/2012' and '1/31/2012' 
ORDER BY ClientUserID, BillingCode, FormTypeID, StartDate 
+0

这样做!谢谢 – dgarbacz 2012-04-19 19:14:54

1

ORDER BY子句以上,加一个UNION ALL行,然后是一个新的SELECT查询,该查询专门为没有计划的同一用户提供信息。只要确保新查询与顶部查询具有相同的列,即使您必须对NULL值进行硬编码。以下是一般语法:

SELECT [stuff] FROM Table1 WHERE [A] 
UNION ALL 
SELECT [samestuff] FROM Table1 WHERE [B] 
ORDER BY [somestuff] 
+0

仅供参考,UNION ALL提供了一切,速度更快,而UNION排除两个数据集之间的重复行,但速度更慢。 – 2012-04-19 18:19:38