2013-04-22 45 views
0

我想创建一个报表来提供来自SQL Server数据库的数据。我有3个表格我感兴趣,客户,推荐,任命。客户可以有1. *推介,推荐可以有0. *约会预约。AVG(DATEDIFF(d,Tabl1.date1,MIN(Table2.date1)))T-SQL

在我的报告中,我想展示从接受推荐到第一次约会的平均时间。

我在我的存储过程中尝试上述,但收到“无法对包含聚合或子查询的表达式执行聚合函数”。

有没有一种很好的方式来让这个工作没有你能想到的子查询?

编辑下面的粗糙表结构。

客户 ClientID的INT的IIdentity(PK) 用名字VARCHAR(50) 姓VARCHAR(50) DOB DATETIME

推荐 ReferralID INT IDENTITY(PK) ClientID的INT(FK) ReferralRequestReceivedDate DATETIME OrgaisationAreaId INT(fk)

约会 AppintmentID INT IDENTITY(PK) ReferralId INT(FK) AppointmentDate DATETIME AttendanceTypeId INT(FK) AppointmentTypeID INT(FK)

AttendanceTypes AttendanceTypeID INT IDENTITY(PK) 名称VARCHAR(50)

AppointmentTypes AppointmentTypeID INT IDENTITY(PK) 名称VARCHAR(50)

OrganisationArea OrgaisationAreaId INT IDENTITY(PK) 名称VARCHAR(50)

我现有的PROC具有计数按年龄和出勤键入如下出席约会......

SELECT OA.Name, 
COUNT(CASE WHEN AppointmentTypeId IN(1,3) 
       AND AppointmentDate BETWEEN '27 Jan 2013' AND '13 Apr 2013' 
       THEN AppointmentId END) AS AppsBooked, 
AVG(DATEDIFF(d, ReferralRequestReceivedDate, MIN(A.AppointmentDate))) 
AS AvgAllocationWaitTime 

FROM OrganisationAreas OA 
LEFT OUTER JOIN Clients C 
    ON OA.OrganisationAreaId = C.OrganisationAreaId 
LEFT OUTER JOIN IaptReferrals R 
    ON C.ClientId = R.ClientId 
LEFT OUTER JOIN IaptAppointments A 
    ON R.IaptReferralId = A.Referral_IaptReferralId 

GROUP BY OA.OrganisationAreaId, OA.Name 
+0

是什么这些表的结构?什么键链接在一起? – 2013-04-22 20:26:43

+0

为什么你想这个工作没有子查询? – 2013-04-23 05:35:26

回答

1

我想不出办法,而不使用子查询或CTE .. 但如果你是确定与子查询,试试这个

SELECT OA.Name, 
COUNT(CASE WHEN 
      AppointmentTypeId IN(1,3) AND AppointmentDate BETWEEN '27 Jan 2013' AND '13 Apr 2013' THEN AppointmentId 
     END) AS AppsBooked, 
AVG(DATEDIFF(d, ReferralRequestReceivedDate, sq.MinAppointmentDate)) AS AvgAllocationWaitTime 
FROM OrganisationAreas OA 
LEFT OUTER JOIN 
(
    SELECT C.OrganisationAreaId, MIN(A.AppointmentDate) MinAppointmentDate 
    FROM IaptAppointments A 
    LEFT OUTER JOIN IaptReferrals R ON R.IaptReferralId = A.Referral_IaptReferralId 
    LEFT OUTER JOIN Clients C ON C.ClientId = R.ClientId 
    GROUP BY C.OrganisationAreaId 
) sq ON sq.OrganisationAreaId = OA.OrganisationAreaId 
GROUP BY OA.OrganisationAreaId, OA.Name 

或CTE版本:

;WITH cte AS 
(
    SELECT C.OrganisationAreaId, MIN(A.AppointmentDate) MinAppointmentDate 
    FROM IaptAppointments A 
    LEFT OUTER JOIN IaptReferrals R ON R.IaptReferralId = A.Referral_IaptReferralId 
    LEFT OUTER JOIN Clients C ON C.ClientId = R.ClientId 
    GROUP BY C.OrganisationAreaId 
) 
SELECT OA.Name, 
COUNT(CASE WHEN 
      AppointmentTypeId IN(1,3) AND AppointmentDate BETWEEN '27 Jan 2013' AND '13 Apr 2013' THEN AppointmentId 
     END) AS AppsBooked, 
AVG(DATEDIFF(d, ReferralRequestReceivedDate, cte.MinAppointmentDate)) AS AvgAllocationWaitTime 
FROM OrganisationAreas OA 
LEFT OUTER JOIN cte ON cte.OrganisationAreaId = OA.OrganisationAreaId 
GROUP BY OA.OrganisationAreaId, OA.Name 
+0

顶级建议Ethan。干杯。使用CTE版本并且喜欢它。 – CheGuevarasBeret 2013-04-24 15:26:25

0

你有这个:

SELECT OA.Name, 
COUNT(CASE WHEN AppointmentTypeId IN(1,3) 
       AND AppointmentDate BETWEEN '27 Jan 2013' AND '13 Apr 2013' 
       THEN AppointmentId END) AS AppsBooked, 
AVG(DATEDIFF(d, ReferralRequestReceivedDate, MIN(A.AppointmentDate))) 
AS AvgAllocationWaitTime 

FROM OrganisationAreas OA 
LEFT OUTER JOIN Clients C 
    ON OA.OrganisationAreaId = C.OrganisationAreaId 
LEFT OUTER JOIN IaptReferrals R 
    ON C.ClientId = R.ClientId 
LEFT OUTER JOIN IaptAppointments A 
    ON R.IaptReferralId = A.Referral_IaptReferralId 

GROUP BY OA.OrganisationAreaId, OA.Name 

让我们看看我们如何改进它。首先,如果您希望介绍日期和首次预约之间的平均时间,则需要内部连接,而不是外部连接。其次,你有一个没有其他条件的情况构造。三,你有什么关于预订似乎无关紧要的约会。最后,你得到了错误的语法错误信息。

要修复最后一个错误,请将最小约会日期移至子查询。这将使您的查询看起来像这样:

select oa.name 
, avg(datediff(d, ReferralRequestReceivedDate, MinAppointmentDate)) 
AvgAllocationWaitTime 

from OrganisationAreas oa 
JOIN Clients C 
    ON OA.OrganisationAreaId = C.OrganisationAreaId 
JOIN IaptReferrals R 
    ON C.ClientId = R.ClientId 
join (
select referral_iaptReferralId refid 
, min(appointmentdate) MinAppointmentDate 
from IaptAppointments 
where clause goes here 
group by referral_iaptReferralId 
) temp on refid = r.iaptReferralId 

where clause goes here 

保持此基本结构。如果您还想预约,请尽量保持简单。

+0

嗨丹。谢谢您的帮助。我使用外连接,因为我仍然希望区域被返回,无论是否有任何引用分配给它,所以我可以显示零计数。欢呼帮助的人。我会尽量让我的头脑围绕CTE功能,看起来很强大。 – CheGuevarasBeret 2013-04-23 08:10:47

相关问题