2013-03-20 123 views
0

这里的情景:SUM SQL查询中 - 左外连接

表:

**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以保持的开始时间和保持的结束时间创建记录。

现在,在查询返回此信息来显示呼叫和其总保持时间,我相信,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返回的NULLS正在使用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 

回答

1

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 
+0

这工作表示感谢。我现在的问题是我在MainCall表中有更多的列,它们也被返回,CallStart,CallAns和CallEnd,这些列用于计算其他值。我返回这些并将它们添加到group by子句中,但它返回到再次显示重复值 – 2013-03-20 21:43:22

+0

您可以显示该代码吗? – DevelopmentIsMyPassion 2013-03-20 21:45:53

+0

代码很大我将尝试修改帖子并在那里显示 – 2013-03-20 21:51:23

0

使用SQL sum()函数和组由子句。

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 
+0

我试过了,它不起作用。仍然得到重复的列 – 2013-03-20 21:37:25

0
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