【问题标题】:Compare results of two selects statements比较两个 select 语句的结果
【发布时间】:2019-08-30 17:22:35
【问题描述】:

如何比较 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 |
+-----------------+-------+

背后的主要问题,两个查询的结果可能不同。 基于上面的示例:查询 1 中缺少 CallDisposition 6 和 26。 查询 2 中缺少 CallDispoition 55 注意:CallDispoition 值可以预期为 0-100,也许这有帮助?!

预期的结果应该是这样的:

+-----------------+-------+
| CallDisposition | Count |
+-----------------+-------+
| 2               |     2 |
| 3               |     1 |
| 4               |     2 |
| 6               |     2 |
| 7               |     1 |
| 10              |    10 |
| ..              |       |
| ..              |       |
| ..              |       |
| 52              |     3 |
| 55              |     1 |
+-----------------+-------+

【问题讨论】:

    标签: sql sql-server tsql sql-server-2014


    【解决方案1】:
    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。我没有运行此代码,但它似乎会产生原始海报正在寻找的结果。但是,“仅代码答案”没有太多长期价值。您应该考虑编辑您的帖子,以包括对您的代码的作用以及它如何解决问题的一些解释。这将对 OP 和将来遇到此帖子的任何其他人都有帮助。
    【解决方案2】:

    老实说,我对您的预期结果感到困惑,并且比较了结果。所以我的解决方案不会产生这样的结果。但也许它可以帮助你指出正确的方向。

    您可以在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;
    

    【讨论】:

      【解决方案3】:

      我可能会将结果插入到一个临时表中,然后进行查询。使用表变量:

      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
      

      重复您的第二个查询,设置 Source = '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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-19
        • 2011-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-30
        • 1970-01-01
        相关资源
        最近更新 更多