Как я могу сравнить результаты двух операторов select в TSQL (2014)?
мои оба запроса:
SELECT CallDisposition, count(CallDisposition) as Count
FROM [bs_Reporting].[dbo].[Termination_Call_Detail]
where (DateTime between dateadd(minute,@timespan,convert(datetime2,(GETDATE())+ @count)) AND convert(datetime2,(GETDATE())+ @count))
Group by CallDisposition
SELECT CallDisposition, count(CallDisposition) as Count
FROM [bs_Reporting].[dbo].[Termination_Call_Detail]
where DateTime >= dateadd(minute,@timespan,convert(datetime2,(GETDATE())))
Group by CallDisposition
Результаты запроса 1:
+-----------------+-------+
| CallDisposition | Count |
+-----------------+-------+
| 2 | 2 |
| 3 | 8 |
| 4 | 8 |
| 7 | 21 |
| 10 | 16 |
| 13 | 738 |
| 14 | 45 |
| 15 | 14 |
| 19 | 8 |
| 28 | 41 |
| 29 | 12 |
| 52 | 76 |
| 55 | 1 |
+-----------------+-------+
Результаты запроса 2:
+-----------------+-------+
| CallDisposition | Count |
+-----------------+-------+
| 2 | 4 |
| 3 | 7 |
| 4 | 6 |
| 6 | 2 |
| 7 | 22 |
| 10 | 6 |
| 13 | 703 |
| 14 | 67 |
| 15 | 11 |
| 19 | 4 |
| 26 | 1 |
| 28 | 62 |
| 29 | 10 |
| 52 | 79 |
+-----------------+-------+
Основная проблема заключается в том, что результаты обоих запросов могут быть разными. На основе приведенного выше примера: CallDisposition 6 и 26 отсутствуют в запросе 1. CallDispoition 55 отсутствует в запросе 2 Примечание. Можно ожидать значений CallDispoition от 0 до 100, может быть, это поможет?!
Ожидаемый результат должен выглядеть так:
+-----------------+-------+
| CallDisposition | Count |
+-----------------+-------+
| 2 | 2 |
| 3 | 1 |
| 4 | 2 |
| 6 | 2 |
| 7 | 1 |
| 10 | 10 |
| .. | |
| .. | |
| .. | |
| 52 | 3 |
| 55 | 1 |
+-----------------+-------+
Честно говоря, я озадачен вашим ожидаемым результатом и тем, что сравнивает результаты. Так что мое решение не даст такого результата. Но, может быть, это поможет, указав вам правильное направление.
Вы можете полностью присоединиться к результатам на calldisposition
. Таким образом, сосуществующие calldisposition
будут располагаться рядом друг с другом. Если для calldisposition
в одном результате никто не существует, в другом столбцы другого будут все NULL
.
SELECT *
FROM (SELECT calldisposition,
count(CallDisposition) count
FROM [bs_Reporting].[dbo].[Termination_Call_Detail]
WHERE (datetime BETWEEN dateadd(minute, @timespan, convert(datetime2, (getdate()) + @count))
AND convert(datetime2, (getdate()) + @count))
GROUP BY calldisposition) x
FULL JOIN (SELECT calldisposition,
count(calldisposition) count
FROM [bs_Reporting].[dbo].[Termination_Call_Detail]
WHERE datetime >= dateadd(minute, @timespan, convert(datetime2, (getdate())))
GROUP BY calldisposition) y
ON y.calldisposition = x.calldisposition;
Я бы, вероятно, вставил результаты во временную таблицу, а затем запросил ее. Используйте табличную переменную:
DECLARE @Results TABLE ([Source] VARCHAR(10), CallDisposition INT, [CallCount] INT)
(Используйте CallCount, так как это не зарезервированное слово)
INSERT INTO @Results(CallDisposition , CallCount, [Source])
SELECT CallDisposition, count(CallDisposition) as Count, [Source] = 'Query1',
FROM [bs_Reporting].[dbo].[Termination_Call_Detail]
where (DateTime between dateadd(minute,@timespan,convert(datetime2,(GETDATE())+ @count)) AND convert(datetime2,(GETDATE())+ @count))
Group by CallDisposition
Повторите со своим вторым запросом, установив Источник = 'Query2' (или объедините его в приведенной выше вставке).
Теперь вы можете проверить свои @Results:
SELECT r1.* FROM @Results r1
WHERE [Source] = 'Query1'
AND NOT EXISTS (SELECT 'X' FROM @Results r2 WHERE [Source] = 'Query2' AND r2.CallDisposition = r1.CallDisposition)
(только пример; возможно, не самый проницательный)
Пожалуйста, простите любые небольшие синтаксические ошибки; Передо мной нет SQL Server.
WITH S1 AS (SELECT CallDisposition, count(CallDisposition) as Count
FROM [bs_Reporting].[dbo].[Termination_Call_Detail]
where (DateTime between dateadd(minute,@timespan,convert(datetime2,(GETDATE())+ @count)) AND convert(datetime2,(GETDATE())+ @count))
Group by CallDisposition
)
,S2 AS (
SELECT CallDisposition, count(CallDisposition) as Count
FROM [bs_Reporting].[dbo].[Termination_Call_Detail]
where DateTime >= dateadd(minute,@timespan,convert(datetime2,(GETDATE())))
Group by CallDisposition
)
Select ISNULL(S1.CallDisposition,S2.CallDisposition) AS CallDisposition
,ABS(ISNULL(S1.COUNT,0)-ISNULL(S2.Count,0)) Count
FROM S1 FULL JOIN S2
ON S1.CallDisposition=s2.CallDisposition
Добро пожаловать в Stack Overflow. Я не запускал этот код, но похоже, что он даст результат, который ищет исходный постер. «Ответы только для кода», однако, не имеют большой долгосрочной ценности. Вам следует подумать о редактировании своего поста, чтобы включить в него объяснение того, что делает ваш код и как он решает проблему. Это поможет как ОП, так и всем, кто встретит этот пост в будущем.