シナリオは次のとおりです。
テーブル:
**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