0

シナリオは次のとおりです。

テーブル:

**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、または多数の保留レコードを含めることができます。呼び出しが保留になるたびに、保留のStartTimeと保留のEndTimeを使用して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

このクエリは、保留レコードが関連付けられていない呼び出しのレコードを返し、NULLとして返す必要があります。保留レコードが1つだけの通話は正しく表示されます。LEFT OUTER JOINによって返されるNULLSは、ISNULL()関数で管理されており、呼び出しに保留時間がないため、ゼロに置き換えられています。

私の問題は、呼び出しに複数の保留レコードがある場合、結果に2回表示されることです。

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
4

3 に答える 3

1

sumとgroupby句を使用するだけです。以下が機能するかどうかを確認してください。

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
于 2013-03-20T21:37:21.777 に答える
0

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
于 2013-03-20T21:35:09.410 に答える
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
于 2013-03-20T21:35:17.270 に答える