sql - 使用基于 ROWCOUNT 的 SUM

标签 sql sql-server sum

基本上我想做的是,有些用户在某个日期范围内(每月)拥有适用的服务

我希望能够显示用户的可用服务时间(以小时为单位),以及他们根据保存预约数据的表安排了多少小时

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

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

Scheduled 列是通过对我的 Appointment 表中 StartEnd 字段进行 SUM 计算得出的.

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

表之间的关系如下:

  • 每个用户 1 NOA
  • 每个 NOA 提供多种服务
  • 每个服务 1 个表单类型

  • 约会将 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 可用,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(第二个总和是正确的)

最佳答案

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

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

关于sql - 使用基于 ROWCOUNT 的 SUM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10233622/

相关文章:

asp.net - 绑定(bind)到 SqlDataSource 的 GridView 控件不更新

mysql - 查找MySQL中两个表的行数差异

php - symfony 1.4 推进 1.6 : sum

mysql - 如何在 SQL Server 2012 中的单个查询中使用 alter table column 和 add constraint

mysql - 使用来自同一列的多个 LIKE 进行查询?

sql-server - 如何在 transact sql 中执行相当于 "#define SomeValue 5"的操作?

sql - 从多个表中获取总和

mysql - 如何提高 SQL 计数性能?

sql - 来自外部驱动器的非常慢的简单 SQLite 查询

mysql - 根据当前表中的相同数据向表中插入数据