SQL Query比较2周

时间:2012-02-09 16:12:20

标签: sql visual-studio tsql

我必须在visual studio中设计一个查询,我有2个数据集。

基本上是这样的。

我想比较每个国家/地区通话的上周呼叫总数。 唯一的问题是,上周的电话可能来自20个差异国家,而本周可能只来自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

当Act状态= 105时,表示呼叫未完成,当它= 5时,表示呼叫成功。我这样做是为了获得每周成功的通话率%。 在此先感谢!

2 个答案:

答案 0 :(得分: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时,因此这是你的案例表达式中的冗余谓词

答案 1 :(得分:2)

根据我的理解,您希望在两周内执行单独的查询,并且您希望两个查询都为所有国家/地区生成行,无论所有国家/地区是否都有任何呼叫。要实现此目的,您需要使用LEFT OUTER JOINS。下面的代码应该保证Country表中找到的每个国家都有一行,即使两个总和都是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

如果这不是你想要的,也许你需要澄清你的问题。许多其他人假设您希望将结果合并到一个查询中。