SQL 전문가 여러분, 저는 직원 전화 번호 표와 1 년 동안 우리 조직에 들어온 모든 통화 표를 가지고 있으며 각 전화 번호마다 발신 및 수신 통화 수를 계산해야합니다.
테이블 전화 번호 :
전화 번호 | 사용자 이름 | 이메일 주소 |
---|---|---|
02078821122 | JBloggs | [email protected] |
테이블 콜 :
데이트 | CallSource | CallDestination |
---|---|---|
2020 년 12 월 10 일 | 07805424828 | 02078821122 |
따라서 내 T-SQL 스크립트는 다음과 같습니다. 직원 PhoneNumber가 호출의 소스 또는 대상 일 수 있으므로 Calls 테이블에서 왼쪽 조인을 두 번 수행해야하기 때문입니다.
SELECT P.PhoneNumber, count(CS.CallSource) AS CallsMade, count(CD.CallDestination) AS CallsReceived
FROM PhoneNumbers P
LEFT JOIN Calls CS ON P.PhoneNumber = CS.CallSource
LEFT JOIN Calls CD ON P.PhoneNumber = CD.CallDestination
GROUP BY P.PhoneNumber
ORDER BY PhoneNumber
제로 카운트도 필요하므로 LEFT JOIN이 필요합니다. 스크립트가 실행되지만 GROUP BY로 인해 총 CallsMade에 각 PhoneNumber의 CallsReceived 값이 곱해지고 결과가 두 열에 모두 표시됩니다. 예를 들어 PhoneNumber 02078820011이 3 번의 통화를하고 2 번의 통화를 받았다고 가정하면 위의 스크립트는 다음을 반환합니다.
전화 번호 | CallsMade | 수신 된 통화 |
---|---|---|
02078820011 | 6 | 6 |
다음과 같은 경우 :
전화 번호 | CallsMade | 수신 된 통화 |
---|---|---|
02078820011 | 삼 | 2 |
누구든지 올바른 카운트를 얻기 위해 스크립트를 수정해야하는 방법을 조언 할 수 있습니까?
호출을 해제하고 집계합니다.
SELECT v.PhoneNumber, SUM(source) as num_source,
SUM(destination) as num_destination
FROM Calls c CROSS APPLY
(VALUES (c.CallSource, 1, 0), (c.CallDestination, 0, 1)
) v(PhoneNumber, source, destination)
GROUP BY v.PhoneNumber
ORDER BY v.PhoneNumber;
PhoneNumbers
목록의 숫자에만 관심이 있다면 다음 을 사용할 수 있습니다.
SELECT p.PhoneNumber, SUM(source) as num_source,
SUM(destination) as num_destination
FROM PhoneNumbers p LEFT JOIN
(Calls c CROSS APPLY
(VALUES (c.CallSource, 1, 0), (c.CallDestination, 0, 1)
) v(PhoneNumber, source, destination)
)
ON p.PhoneNumber = v.PhoneNumber
GROUP BY p.PhoneNumber
ORDER BY p.PhoneNumber;
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다