[英]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.