我必须在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时,表示呼叫成功。我这样做是为了获得每周成功的通话率%。 在此先感谢!
答案 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
如果这不是你想要的,也许你需要澄清你的问题。许多其他人假设您希望将结果合并到一个查询中。