2012-02-09 127 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