0

我正在使用这个 sql 代码查询一个表(我的表有 NULL 值):

SELECT x.f1,Count(x.f1) FROM
(SELECT p1 As F1 FROM table
 UNION ALL
 SELECT p2 As F1 FROM table
 UNION ALL
 SELECT p3 As F1 FROM table) x
GROUP BY x.f1

此代码实现了该用户提出的问题: SQL, count in multiple columns then group by

但是,当我在所有列上使用此语句手动测试表中某个项目的计数时:

WHERE col1 or col2 or col3, etc = 'entry name' 

,我得到的该条目的计数与联合查询不同。联合查询要么超出手动查询的数量,要么等于手动查询(我想要的)。例如,对于某个条目,手动查询会返回 2,联合查询会返回 4。

我意识到这个问题有点含糊,因为我无法透露我的表格信息或确切的查询,但我想知道我是否遗漏了一些重要的东西。谢谢!

PS。我正在使用 MS SQL 服务器 2012

编辑:示例(取自先前用户的帖子),以澄清:

源数据表:

P1  P2  P3
-----------
a   b   
a   a   a
b   c   
a   b   b
b   a

我希望它显示如下内容:

所需的查询输出:

     Total
   -------------
a |    6
b |    5
c |    1

对 MY 表使用上面的 UNION 查询代码,我将得到 12 作为“a”的总数。使用我的手动查询:

SELECT *
FROM TABLE
WHERE P1 = 'a' OR P2 = 'a' OR P3 ='a'

, 我会得到 6 的总数。

我的问题是,两个查询不应该返回相同的值吗?

4

3 回答 3

3

首先,确实没有理由认为这两个查询会返回相似的结果。带有where子句的一个是计算行数,而不管匹配的数量。根据、 和中的值,具有 的那个union all可以将每一行最多计数三次。p1p2p3

要使用 计算行数union all,您需要一个 id 来标识每一行。然后您可以count(distinct id)在外部查询中使用。

于 2013-07-05T19:13:59.303 回答
1

col1 or col2 or col3, etc = 'entry name'不是正确的语法。它只是检查是否col1col2任何价值。仅根据实际值检查列表中的最后一项'entry name'

于 2013-07-05T19:12:55.193 回答
0

UNION方法在表中运行 3 次以查找匹配项,如果同一行在多于一列中具有匹配值,则会对同一行进行两次计数。该OR方法仅在表格中运行一次,并且不会重复计算任何内容。

记住,UNION不要结合你的条件;它结合了每个组件查询的实际行输出。这与使用OR.

于 2013-07-05T19:50:58.237 回答