简体   繁体   English

SQL查询中的SUM-左外部联接

[英]SUM within SQL Query - Left Outer Join

Here is the Scenario: 这是方案:

Tables: 表格:

**CallMain:**

Call_ID = PK (INT)
Abandoned (INT) Either 1 or NULL


**CallHold:**

Hold_ID = PK (INT)

Call_ID = FK (INT)

StartTime (INT)

EndTime (INT)

Each call held in the CallMain table can have either 1, 0 or many hold records. CallMain表中保持的每个呼叫可以具有1、0或许多保持记录。 Each time the call goes on hold an record is created referenced by the FK with the StartTime of the hold and the EndTime of the hold. 每次呼叫保持时,FK都会使用保持的StartTime和保持的EndTime创建一条记录。

Now, to return this information in a query to show calls and their total hold times, I believe the SQL to be as follows: 现在,要在查询中返回此信息以显示呼叫及其总保持时间,我相信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

This query should return records for calls that have no hold records associated with them and should return them as NULLS. 该查询应返回没有与之关联的保留记录的呼叫的记录,并且应将它们作为NULLS返回。 Calls with a single hold record appear correctly. 具有单个保留记录的呼叫会正确显示。 The NULLS that are being returned by the LEFT OUTER JOIN are being managed with the ISNULL() function and being replaced with a zero as in effect that call has no hold time. 由LEFT OUTER JOIN返回的NULL由ISNULL()函数管理,并由零代替,这实际上意味着调用没有保持时间。

My problem is that where a call has multiple hold records it will appear twice in the result ie: 我的问题是,如果一个呼叫有多个保留记录,它将在结果中出现两次,即:

Call_ID, HoldPeriod

212, 254

213, 154

214, 158

214, 25

214, 10

As can be seen above, Call 214 has multiple hold records totalling 193. How can I add this up in the query so it will show just the total hold period for that call instead of repeating the call record multiple times in the result? 从上面可以看到,呼叫214有多个总计193的保留记录。我如何在查询中将其加起来,以便仅显示该呼叫的总保留期,而不是在结果中重复多次该呼叫记录?

Solution Being 解决方案

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 - Here is the code @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

Just use sum and group by clause. 只需使用sum和group by子句即可。 See if below works. 看看下面是否可行。

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

Use an sql sum() function and group by clause. 使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM