2012-02-09 136 views
1

我必須在visual studio中設計一個查詢,其中有2個數據集。SQL查詢比較2周

基本上就是這樣。

我想比較調用這個周總打電話上週每個國家。 的唯一事情就是最後幾周呼叫可能有來自20個國家的diff,而這個星期可能只能來自15 我怎樣才能使查詢,使得20個國家將出現兩個同時具有爲「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 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 2012-02-09 16:25:17

回答

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 2012-02-10 12:46:20

+0

我認爲OP在談論所有國家*在兩週內引用*,而不是所有可用的國家。也就是說,有些國家可能僅在本週出現,其他國家則僅在上週出現,但OP需要這兩者,以及上週出現這兩種情況的那些國家。另一方面,假設'actTerminalDateTime'是'termactivity'中的一列,你的'WHERE'子句有效地使你的外連接* inner *,所以結果可能只包含相關的國家。 – 2012-02-10 13:19:55

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 

我也收拾你的查詢略有下降,例如存在指定

WHEN ActStatus IN (5, 105) ... 

沒有一點當你的WHERE子句已經限制了所有的結果爲5,105,因此,這是一個多餘的謂語你的情況表達

+0

是的..其實喜歡你的解決方案比我的... – DRapp 2012-02-09 17:22:50

+0

優秀的乾杯! – Axle 2012-02-10 13:17:05