如何比较两个表获得真假计数

Posted

技术标签:

【中文标题】如何比较两个表获得真假计数【英文标题】:How to get True and False count comparing two tables 【发布时间】:2018-10-24 09:36:30 【问题描述】:

我在下面提到了两个表:

表1:

ID        Code
URT-112   AAB
URT-113   12F
URT-114   234
URT-115   [Null]

表2:

Merchant_ID     Flag
URT-112         CDE
URT-113         11F
URT-114         234
URT-115         DEW

通过利用上面的表格,并认为Table2 是准确的,我想知道Table1 中有多少条目是错误的。

我正在使用亚马逊红移。

所需的输出应如下所示:

TRUE    FALSE     NULL
  1       2        1

【问题讨论】:

嗨,发布的答案有效吗? 【参考方案1】:

用例当

SELECT 
  SUM(case when  t2.Flag = t1.Code then 1 else 0 end) AS TRUE_CNT, 
  SUM(case when t1.Code is not null and t2.Flag <> t1.Code then 1 else 0 end) AS FALSE_CNT,  
  SUM(case when  t1.Code IS NULL then 1 else 0 end) AS  NULL_CNT
FROM Table2 AS t2 
LEFT JOIN Table1 AS t1 ON t2.Merchant_ID = t1.ID

【讨论】:

【参考方案2】: 使用 ID 从 Table2 到 Table1 执行 Left join。 使用Sum() 等聚合函数,以及Ifnull()IS NOT NULL 等条件函数/运算符。 Code 是 keyword in mysql。您应该避免将其用作表名称,而应使用其他名称。如果您仍需要使用它,则必须在其周围使用反引号。

尝试以下方法 (DB Fiddle DEMO):

SELECT 
  SUM(IF(t1.`Code` IS NOT NULL, t2.Flag = t1.`Code`, 0)) AS `TRUE`, 
  SUM(IF(t1.`Code` IS NOT NULL, t2.Flag <> t1.`Code`, 0)) AS `FALSE`, 
  SUM(IF(t1.`Code` IS NULL, 1, 0)) AS `NULL`
FROM Table2 AS t2 
LEFT JOIN Table1 AS t1 ON t1.ID = t2.Merchant_ID 

缩短版 (DB Fiddle):

SELECT 
  SUM(t1.`Code` IS NOT NULL AND t2.Flag = t1.`Code`) AS `TRUE`, 
  SUM(t1.`Code` IS NOT NULL AND t2.Flag <> t1.`Code`) AS `FALSE`,  
  SUM(t1.`Code` IS NULL) AS `NULL`
FROM Table2 AS t2 
LEFT JOIN Table1 AS t1 ON t1.ID = t2.Merchant_ID;

【讨论】:

以上是关于如何比较两个表获得真假计数的主要内容,如果未能解决你的问题,请参考以下文章

如何通过比较两个表来获得工作日数?

在excel中获得两个条件的唯一计数

Athena 计算两个表上的重复行

结合两个查询并获得计数的总和

如何在熊猫中获得 False 的计数 [重复]

比较具有相同模式的两个表以获得数据差异