我使用这个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'
,与union查询一样,我得到的条目数不同。联合查询要么超过手动查询的数量,要么等于手动查询(我想要的)。例如,对于某个条目,手动查询将返回2,并且联合查询将返回4.
我意识到这个问题有点模糊,因为我无法透露我的表信息或我的确切查询,但我想知道我是否遗漏了一些重要的东西。谢谢!
PS。我正在使用MS SQL server 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分。
我的问题是,两个查询都不应该返回相同的值吗?
答案 0 :(得分:3)
首先,没有理由认为这两个查询会返回类似的结果。具有where
子句的那个是计数行,而不管匹配的数量。具有union all
的人可以将每行最多计算三次,具体取决于p1
,p2
和p3
中的值。
要使用union all
计算行数,您需要一个ID来标识每一行。然后,您可以在外部查询中使用count(distinct id)
。
答案 1 :(得分:1)
col1 or col2 or col3, etc = 'entry name'
不是正确的语法。它只检查col1
和col2
是否有任何值。仅根据实际值'entry name'
检查列表中的最后一个。
答案 2 :(得分:0)
UNION
方式在表中运行三次以查找匹配项,如果它在多个列中具有匹配值,则将对同一行计数两次。 OR
方式仅在表格中运行一次,不会重复计算任何内容。
请记住,UNION
不符合您的条件;它结合了来自每个组件查询的实际行输出。这与使用OR
完全不同。