首页 > 解决方案 > 选择两个表之间的差异

问题描述

我想列出四列,日期、每小时计数、每日计数和两个计数之间的差异。

我已将 union all 用于两个表,但我得到了 2 行,如图所示:

图片

Select a.date, a.hour,b.daily,sum(a.hour-b.daily)
from (select date,count(*) hour,''daily 
From table a union all select '' hour,count(*) daily from table b) 
Group by date, daily, hourly..

请向我建议一个解决方案。

标签: sqlsql-server

解决方案


我看到提供的代码使用 aUNION来实现输出。这将通过使用某种更好的服务JOIN

结果是table_a按 分组date的总行数减去按 分组的总行table_bdate

此代码未经测试,但应该很好地说明如何实现这一点:

SELECT  a.date,
        a.hour,
        ISNULL(b.daily, 0) AS daily,
        a.hour - ISNULL(b.daily) AS difference
  FROM  (
        SELECT  date,
                COUNT(*) AS hour
          FROM  table_a
          GROUP BY date
        ) a
    LEFT JOIN (
               SELECT  date,
                       COUNT(*) AS daily
                 FROM  table_b
                 GROUP BY date
               ) b ON b.date = a.date
  ORDER BY a.date;

这通过以下方式起作用:

  1. 计算每个日期的计数table_a
  2. 计算每个日期的计数table_b
  3. 将所有结果table_a与匹配的结果连接起来table_b
  4. 输出datehourfrom table_a、 the daily(or 0 if NULL) fromtable_b以及两者之间的差异。

笔记:

  • 我已将table aand重命名table btable_aand table_b。我认为这些不是实际的表名
  • 如果您只想要两个表中具有匹配列的INNER JOIN结果,则可能更可取。date使用LEFT JOIN将返回所有结果,table_a无论是否table_b有条目。
  • 我不相信这date是一个允许的列名,但我已经按照 OP 给出的示例在代码中复制了它。

推荐阅读