簡體   English   中英

SQL查詢中的SUM-左外部聯接

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM