SQL-запрос для сравнения 2 недели - PullRequest
1 голос
/ 09 февраля 2012

Мне нужно разработать запрос в 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 status = 105, это означает, что вызов не был завершен, а когда = 5, это означает, что вызов был успешным. Я делаю это, чтобы получить процент успешных звонков в неделю. Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 09 февраля 2012

Примените ту же логику, что и к общему количеству звонков и неудачных звонков, как и к этой неделе и на прошлой неделе.

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, поэтому это предикат в вашем случае выражения

2 голосов
/ 09 февраля 2012

Насколько я понимаю, вы хотите выполнять отдельные запросы в течение двух недель, и вы хотите, чтобы оба запроса производили строки для всех стран, независимо от того, были ли во всех странах какие-либо вызовы. Для этого вам нужно использовать ЛЕВЫЕ НАРУЖНЫЕ СОЕДИНЕНИЯ. Приведенный ниже код должен гарантировать, что в каждой стране, найденной в таблице «Страна», есть строка, даже если обе суммы равны 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

Если это не то, что вы хотели, возможно, вам нужно уточнить свой вопрос. Многие другие предположили, что вы хотите объединить результаты в один запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...