为什么此代码返回重复的行?

时间:2019-07-17 19:53:00

标签: sql sql-server

我有这段代码返回重复的行,不应该这样。这些行是正确的,但有时它将返回2至10个完全相同的行。

我自己无法弄清楚,但我希望有人能发现问题。

Select v.sr_name, v.workdate, u.Calls_in, u.Calls_Out, u.Chats, u.reaches, u.books, u.attends, v.hoursworked
from
(
select sr_name, 
cast(punchintime as date) as workdate,
ROUND(sum(cast(datediff(minute,punchintime, punchouttime) as real)/60),2) as hoursworked,
count(*) as punches
from
(
select sr_name,
punchintime = punchdatetime,
punchouttime = ISNULL((select top 1 pc2.punchdatetime from punchclock pc2 where pc2.punchdatetime > pc.punchdatetime and pc.servrepid = pc2.servrepid and pc2.inout = 0 order by pc2.punchdatetime), getdate())

from punchclock pc
join servicereps sr on pc.servrepid = sr.servrepid
where punchyear >= 2017 and pc.inout = 1
)x
group by sr_name, cast(punchintime as date)
) v

join 
(
select sr.sr_name, t.*,
Calls_Out = (select count(*) from CRM_Correspondence cr where cast(cr.DateCreated as date) = workdate and StatusType IN ('Follow Up','Call Attempted','Call Reached','Returned Call') and cr.ServRepID = t.servrepid),
Calls_In =  (Select count(*) AS numCallIns
        from CRM_Accounts ca
            JOIN Contact c on c.contactid = ca.contactid
            JOIN CRM_Correspondence cor on cor.CorrespondenceID = ca.firstCorRecordID
            JOIN referraltypes rt on c.referralid = rt.referralid
        where cast(cor.DateCreated as date) = workdate and rt.ReferralName LIKE '%Call In%'
        and cor.servrepid =  t.servrepid),
Chats = (select COUNT(*)
            from crm_correspondence cor
            left join Contact ct on cor.ContactID = ct.contactID
            left join ReferralTypes rt on rt.ReferralID = ct.ReferralID
            where cast(cor.datecreated as date) = workdate
            and ((cor.StatusType = 'Chat'  and cor.chanid in (3,4)) or (cor.StatusType = 'NEW' and rt.ReferralName like '%Chat%'))
            and cor.servrepid =  t.servrepid),
reaches = (select count(*) from CRM_Correspondence cr where cast(cr.DateCreated as date) = workdate and (StatusType = 'call reached' or StatusType like '%SCHEDULE%') and cr.ServRepID = t.servrepid),
books = (select count(*) from os_appointments o where cast(o.DateCreated as date) = workdate  and isnull(o.confirmedby, o.booked_by) = t.servrepid),
attends = (select count(*) from os_appointments o where cast(o.DateCreated as date) = workdate  and isnull(o.confirmedby, o.booked_by) = t.servrepid and o.appointmentStatus = 'attended')

from
(
select cast(cor.datecreated as date) workdate, cor.ServRepID, correspondenceID
from CRM_Correspondence cor
where cor.datecreated >= '2017-01-01'
group by cast(cor.datecreated as date), cor.servrepid, correspondenceID
) t
join ServiceReps sr on t.ServRepID = sr.ServRepID
join CRM_Accounts ca on t.CorrespondenceID = ca.firstCorRecordID
) u on v.sr_name = u.sr_name and v.workdate = u.workdate

我只想要每一行中的一行。

0 个答案:

没有答案