[英]SUM within SQL Query - Left Outer Join
这是方案:
表格:
**CallMain:**
Call_ID = PK (INT)
Abandoned (INT) Either 1 or NULL
**CallHold:**
Hold_ID = PK (INT)
Call_ID = FK (INT)
StartTime (INT)
EndTime (INT)
CallMain表中保持的每个呼叫可以具有1、0或许多保持记录。 每次呼叫保持时,FK都会使用保持的StartTime和保持的EndTime创建一条记录。
现在,要在查询中返回此信息以显示呼叫及其总保持时间,我相信SQL如下:
SELECT CallMain.Call_ID, CallMain.Abandoned,
ISNULL((CallHold.EndTime - CallHold.StartTime),0) AS HoldPeriodSeconds
FROM CTIStatCall
LEFT OUTER JOIN CallHold ON CallMain.Call_ID = CallHold.Call_ID
该查询应返回没有与之关联的保留记录的呼叫的记录,并且应将它们作为NULLS返回。 具有单个保留记录的呼叫会正确显示。 由LEFT OUTER JOIN返回的NULL由ISNULL()函数管理,并由零代替,这实际上意味着调用没有保持时间。
我的问题是,如果一个呼叫有多个保留记录,它将在结果中出现两次,即:
Call_ID, HoldPeriod
212, 254
213, 154
214, 158
214, 25
214, 10
从上面可以看到,呼叫214有多个总计193的保留记录。我如何在查询中将其加起来,以便仅显示该呼叫的总保留期,而不是在结果中重复多次该呼叫记录?
解决方案
SELECT CallMain.Call_ID, CallMain.Abandoned,
sum(ISNULL((CallHold.EndTime - CallHold.StartTime),0)) AS HoldPeriodSeconds FROM CTIStatCall LEFT OUTER JOIN CallHold ON CallMain.Call_ID = CallHold.Call_ID group by CallMain.Call_ID, CallMain.Abandoned
@AshReva-这是代码
SELECT CallMain.Call_ID, dateadd(s,CallMain.StartTime, '1970-01-01') AS StartTime,
dateadd(s,CallMain.AnsTime, '1970-01-01') AS AnsTime,
dateadd(s,CallMain.EndTime, '1970-01-01') AS EndTime,
CallMain.Abandoned,
(CallMain.AnsTime - CallMain.StartTime) AS RingPeriod,
SUM(ISNULL((CallHold.EndTime - CallHold.StartTime),0)) AS HoldPeriod,
(CallMain.EndTime - CallMain.AnsTime) - ISNULL((CallHold.EndTime - CallHold.StartTime),0) AS TalkPeriod
FROM CallMain
LEFT OUTER JOIN
CallHold ON CallMain.Call_ID = CallHold.Call_ID
GROUP BY CallMain.Call_ID, CallMain.Abandoned, CallMain.StartTime, CallMain.EndTime, CallMain.AnsTime, CallHold.EndTime, CallHold.StartTime
order by CallMain.Call_ID
只需使用sum和group by子句即可。 看看下面是否可行。
SELECT
CallMain.Call_ID,
CallMain.Abandoned,
sum(ISNULL((CallHold.EndTime - CallHold.StartTime),0)) AS HoldPeriodSeconds
FROM CTIStatCall
LEFT OUTER JOIN CallHold
ON CallMain.Call_ID = CallHold.Call_ID
group by CallMain.Call_ID, CallMain.Abandoned
使用sql sum()函数和group by子句。
SELECT CallMain.Call_ID, CallMain.Abandoned,
sum(ISNULL((CallHold.EndTime - CallHold.StartTime),0)) AS HoldPeriodSeconds
FROM CTIStatCall
LEFT OUTER JOIN CallHold ON CallMain.Call_ID = CallHold.Call_ID
group by CallMain.Call_ID, CallMain.Abandoned
SELECT
CallMain.Call_ID,
CallMain.Abandoned,
Sum(ISNULL((CallHold.EndTime - CallHold.StartTime), 0)) AS HoldPeriodSeconds
FROM
CallMain
LEFT OUTER JOIN
CallHold
ON
CallMain.Call_ID = CallHold.Call_ID
GROUP BY
CallMain.Call_ID,
CallMain.Abandoned
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.