sql - 选择两个表之间的差异
问题描述
我想列出四列,日期、每小时计数、每日计数和两个计数之间的差异。
我已将 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..
请向我建议一个解决方案。
解决方案
我看到提供的代码使用 aUNION
来实现输出。这将通过使用某种更好的服务JOIN
。
结果是table_a
按 分组date
的总行数减去按 分组的总行table_b
数date
。
此代码未经测试,但应该很好地说明如何实现这一点:
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;
这通过以下方式起作用:
- 计算每个日期的计数
table_a
。 - 计算每个日期的计数
table_b
。 - 将所有结果
table_a
与匹配的结果连接起来table_b
。 - 输出
date
、hour
fromtable_a
、 thedaily
(or 0 ifNULL
) fromtable_b
以及两者之间的差异。
笔记:
- 我已将
table a
and重命名table b
为table_a
andtable_b
。我认为这些不是实际的表名 - 如果您只想要两个表中具有匹配列的
INNER JOIN
结果,则可能更可取。date
使用LEFT JOIN
将返回所有结果,table_a
无论是否table_b
有条目。 - 我不相信这
date
是一个允许的列名,但我已经按照 OP 给出的示例在代码中复制了它。
推荐阅读
- batch-file - 批量制作文本文件输入未复制
- libreoffice - 如何将数据复制到单元格中,制作表格并向其中添加更多数据
- algorithm - 图中最有利的路径(但不是最短的)
- c - 不知道打印结果句时如何让随机数0,1,2显示为rock, paper, and sissors
- azure - 从 Azure 数据流中的变量运行源 SQL 时出现解析错误
- c - C的格式说明符问题
- assembly - 如何在emu8086中不使用减法或加法将小写转换为大写,反之亦然
- c# - ReSharper ContractAnnotation for Null Check + Out Variable 给出反直觉的结果
- flutter - Flutter:使用 InterstitialAd 时,该库禁用了 Null 安全功能?_interstitialAd;
- javascript - 如果函数在 1 秒内被调用 50 次,则只运行一次