如何在SQL Server 2014的TSQL中比较两个SELECT语句的结果?
对比两个TSQL查询结果的差异(SQL Server 2014)
要清晰对比这两个查询的结果差异,我们可以用**CTE(公用表表达式)**把两个查询的结果临时存储,再通过FULL OUTER JOIN合并数据集,这样就能完整覆盖所有出现过的CallDisposition,包括只在其中一个查询里出现的值。
实现代码
WITH Query1 AS ( SELECT CallDisposition, COUNT(CallDisposition) AS Count1 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 AS ( SELECT CallDisposition, COUNT(CallDisposition) AS Count2 FROM [bs_Reporting].[dbo].[Termination_Call_Detail] WHERE DateTime >= DATEADD(minute, @timespan, CONVERT(datetime2, GETDATE())) GROUP BY CallDisposition ) SELECT COALESCE(q1.CallDisposition, q2.CallDisposition) AS CallDisposition, ISNULL(q1.Count1, 0) AS Query1_Count, ISNULL(q2.Count2, 0) AS Query2_Count, ISNULL(q1.Count1, 0) - ISNULL(q2.Count2, 0) AS Count_Difference FROM Query1 q1 FULL OUTER JOIN Query2 q2 ON q1.CallDisposition = q2.CallDisposition -- 可选:只显示有差异的行 -- WHERE ISNULL(q1.Count1, 0) <> ISNULL(q2.Count2, 0) ORDER BY CallDisposition;
代码说明
- CTE定义:把两个原始查询分别存入
Query1和Query2,给计数列起不同别名避免冲突。 - 全外连接:
FULL OUTER JOIN确保不管CallDisposition只在哪个查询中存在,都会被包含在结果里。 - 空值处理:用
COALESCE获取有效的CallDisposition值,用ISNULL把不存在的计数转为0,方便后续计算差值。 - 差异计算:
Count_Difference列直接展示两个查询计数的差值,正数表示Query1的计数更高,负数则相反。
基于你提供的示例数据,运行结果如下
| CallDisposition | Query1_Count | Query2_Count | Count_Difference |
|---|---|---|---|
| 2 | 2 | 4 | -2 |
| 3 | 8 | 7 | 1 |
| 4 | 8 | 6 | 2 |
| 6 | 0 | 2 | -2 |
| 7 | 21 | 22 | -1 |
| 10 | 16 | 6 | 10 |
| 13 | 738 | 703 | 35 |
| 14 | 45 | 67 | -22 |
| 15 | 14 | 11 | 3 |
| 19 | 8 | 4 | 4 |
| 26 | 0 | 1 | -1 |
| 28 | 41 | 62 | -21 |
| 29 | 12 | 10 | 2 |
| 52 | 76 | 79 | -3 |
| 55 | 1 | 0 | 1 |
如果你只需要看到有差异的行,只需要把代码里的WHERE注释去掉即可。
内容的提问来源于stack exchange,提问作者Jan Rühle
相关产品推荐
相关产品推荐

