2012-02-09 3 views
1

2 개의 데이터 세트가있는 Visual Studio에서 쿼리를 디자인해야합니다.SQL 쿼리 비교 2 주

기본적으로 이렇게됩니다.

이번 주 통화 총계를 국가 호출 당 지난주와 비교하고 싶습니다. 유일한 주간은 지난 주에 전화가 20 개국에서 온 것일 수 있으며 이번주는 15시에 불과할 수 있습니다. "0"값이있는 동안 20 개 국가가 모두 표시되도록하려면 어떻게해야합니까? 이번 주에 나타나지 않는 국가.

아래 내 쿼리입니다 :

Select country, 
     Sum(Case When actstatus in (5,105) Then 1 Else 0 End) As TotalCalls, 
     Sum(Case When actstatus = 105 Then 1 Else 0 End) As FailedCalls 
From termactivity(nolock) 
    INNER JOIN termconfig(NOLOCK) ON cfgterminalID = actterminalID 
    INNER JOIN Country (nolock) on country = cycode 

Where actstatus in (5,105) 
and (actTerminalDateTime BETWEEN @StartDate-7 AND @EndDate-7) 

Group By country 
order By country asc 

법 상태 = 105가 완료되지 않은 전화를 의미하고 5 = 때 호출이 성공을 의미합니다. 나는 주당 성공적으로 전화 비율을 얻으려고 이것을하고있다. 미리 감사드립니다.

+0

termactivity 및 termconfig 테이블의 구조를 게시 할 수 있습니까? – Diego

답변

2

에 술어, 2 주에 대해 별도의 쿼리를 수행하려면, 당신은 두 쿼리에 관계없이 모든 국가가 어떤 통화를했다 여부, 모든 국가의 행을 생성합니다. 이를 수행하려면 LEFT OUTER JOINS를 사용해야합니다. 아래의 코드는 당신이 아마 당신이 당신의 질문을 명확히 할 필요가 원하는 것을하지 않았다 경우 모두 합계가 0

SELECT country, 
    SUM(CASE WHEN actstatus IN (5,105) THEN 1 ELSE 0 END) AS TotalCalls, 
    SUM(CASE WHEN actstatus = 105 THEN 1 ELSE 0 END) AS FailedCalls 
FROM Country (NOLOCK) 
    LEFT OUTER JOIN termconfig (NOLOCK) ON country = cycode 
    LEFT OUTER JOIN termactivity (NOLOCK) ON cfgterminalID = actterminalID 
WHERE (actTerminalDateTime BETWEEN @StartDate-7 AND @EndDate-7) 

GROUP BY country 
ORDER BY country ASC 

경우에도 국가 테이블에있는 모든 국가가 행이 보장되어야합니다. 많은 다른 사람들은 결과를 단일 쿼리로 결합하려고한다고 가정했습니다.

+0

안녕하세요. 고맙습니다.하지만 나중에 하나의 검색어로 모든 것을 원합니다. – Axle

+0

나는 OP가 모든 나라들에 대해 이야기하고 있다고 생각한다. 즉, 일부 국가는 이번 주에만, 다른 국가는 지난 주에 게재 될 수 있지만 OP는 둘 다 원할뿐 아니라 * 및 * 지난 주에 모두 표시됩니다. 반면에'actTerminalDateTime'이'termactivity'의 컬럼이라고 가정하면'WHERE' 절은 외부 조인 * inner *를 효과적으로 만듭니다. 따라서 결과는 관련 국가 만 포함 할 수 있습니다. –

4

이번 주와 지난 주에했던 것처럼 총 통화 수 및 실패한 통화 수와 동일한 논리를 적용하십시오.

SELECT country, 
     COUNT(CASE WHEN actTerminalDateTime < @StartDate THEN 1 END) [LastWeekTotalCalls], 
     COUNT(CASE WHEN ActStatus = 105 AND actTerminalDateTime < @StartDate THEN 1 END) [LastWeekFailedCalls], 
     COUNT(CASE WHEN actTerminalDateTime >= @StartDate THEN 1 END) [ThisWeekTotalCalls], 
     COUNT(CASE WHEN ActStatus = 105 AND actTerminalDateTime >= @StartDate THEN 1 END) [ThisWeekFailedCalls] 
FROM termactivity (NOLOCK) 
     INNER JOIN termconfig (NOLOCK) 
      ON cfgterminalID = actterminalID 
     INNER JOIN Country (NOLOCK) 
      ON country = cycode 
WHERE actstatus in (5,105) 
AND  actTerminalDateTime BETWEEN DATEADD(DAY, -7, @StartDate) AND @EndDate 
GROUP BY country 
ORDER BY country ASC 

는 또한 그러므로이 중복이며, 당신의 WHERE 절은 이미 5, 105에 대한 모든 검색 결과를 제한 할 때

WHEN ActStatus IN (5, 105) ... 

을 지정 아무 문제가 없다 예를 들어, 약간 쿼리를 정돈 한 내가 이해에서 귀하의 경우 표현

+0

예 .. 사실 당신의 솔루션이 제 것보다 낫습니다 ... – DRapp

+0

우수 환호! – Axle