在 SQL 中获取两个计数的差异

Posted

技术标签:

【中文标题】在 SQL 中获取两个计数的差异【英文标题】:Getting difference of two counts in SQL 【发布时间】:2011-10-17 20:53:08 【问题描述】:

我正在 Netezza 中进行一些 QA,我需要比较两个单独的 SQL 语句的计数。这是我目前使用的 SQL

SELECT COUNT(*) AS RECORD_COUNT  
FROM db..EXT_ACXIOM_WUL_FILE  A
LEFT JOIN (select distinct CURRENTLY_OPTED_IN_FL,mid_key from db..F_EMAIL) B
ON A.MID_KEY=B.MID_KEY
MINUS
SELECT COUNT(*)
FROM db..EXT_ACXIOM_WUL_FILE  A

但是,MINUS 似乎不是这样工作的。当计数匹配时,这将为 Record_count 返回 null,而不是返回 0。我基本上将记录数计算为:

record_count=count1-count2

因此,如果计数相等,则为 0,否则为差异。正确的 SQL 是什么?

【问题讨论】:

【参考方案1】:
SELECT
(
SELECT COUNT(*) AS RECORD_COUNT  
FROM db..EXT_ACXIOM_WUL_FILE  A
LEFT JOIN (select distinct CURRENTLY_OPTED_IN_FL,mid_key from db..F_EMAIL) B
ON A.MID_KEY=B.MID_KEY
)  -
(
SELECT COUNT(*)
FROM db..EXT_ACXIOM_WUL_FILE  A
) TotalCount

Oracle 的MINUS(SQL Server 中的EXCEPT)是完全不同的动物 :)

如果你理解UNION然后思考集合,你就会理解MINUS/EXCEPT

【讨论】:

【参考方案2】:

MINUS 是设置差异,不适用于算术运算。

你可以的

SELECT COUNT(*) - (SELECT COUNT(*)
                   FROM   db..EXT_ACXIOM_WUL_FILE A) AS Val
FROM   db..EXT_ACXIOM_WUL_FILE A
       LEFT JOIN (select distinct CURRENTLY_OPTED_IN_FL,
                                  mid_key
                  from   db..F_EMAIL) B
         ON A.MID_KEY = B.MID_KEY  

或者其他选项

SELECT COUNT(*) - COUNT(DISTINCT A.PrimaryKey) AS Val
FROM   db..EXT_ACXIOM_WUL_FILE A
       LEFT JOIN (select distinct CURRENTLY_OPTED_IN_FL,
                                  mid_key
                  from   db..F_EMAIL) B
         ON A.MID_KEY = B.MID_KEY  

【讨论】:

【参考方案3】:

我想这可能就是你要找的东西

    SELECT COUNT(distinct(CURRENTLY_OPTED_IN_FL + F_EMAIL.MID_KEY)) - count(distinct(EXT_ACXIOM_WUL_FILE.MID_KEY))
    FROM EXT_ACXIOM_WUL_FILE 
    LEFT OUTER JOIN F_EMAIL
      ON JOIN F_EMAIL.MID_KEY = EXT_ACXIOM_WUL_FILE.MID_KEY

【讨论】:

以上是关于在 SQL 中获取两个计数的差异的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQL 获取 2 列之间日期差异的计数(值的分布)?

SQL 获取时间戳差异大于 30 时的 id 计数

查找计数差异 - Microsoft Access 和 SQL

为啥 SQL 计数(*)与 SQL 计数(数字)存在行为差异

Sql查询在同一查询中查找具有差异条件的计数和总计数

BigQuery 减去两个表的计数?