我有一个关于你的问题 group by .例如:
group by
select COUNT(*) from (select 0 c1) t1 where 0 = 1 group by t1.c1
结果-无记录
select COUNT(*) from (select 0 c1) t1 where 0 = 1 --group by t1.c1
结果-0为什么?
7lrncoxx1#
当你过滤时 WHERE 0 = 1 ,没有与筛选器匹配的行。如果不添加GROUPBY语句,则该表中的所有行都将被视为1个group。因此,结果计数将为0—对于组,有0行与筛选器匹配。添加分组列时,SQLServer必须执行相同的计数,但现在按该列的每个不同值分组。由于您的筛选器不返回分组列的任何值,因此没有要创建的组。所以结果是没有记录。所以两组的差别是0组对1组。无结果vs结果。
WHERE 0 = 1
4sup72z82#
没有 GROUP BY 总是返回一行。过滤掉所有行后,行上的大多数值 NULL . 例外情况是 COUNT() 价值观 0 .具有 GROUP BY 为每个值组合返回一行。当筛选出所有行时,没有组,因此不返回任何内容。您的第一个查询具有 GROUP BY 但过滤掉所有行。因此,没有行。第二个查询没有 GROUP BY ,因此返回一行。
GROUP BY
NULL
COUNT()
0
2条答案
按热度按时间7lrncoxx1#
当你过滤时
WHERE 0 = 1
,没有与筛选器匹配的行。如果不添加GROUPBY语句,则该表中的所有行都将被视为1个group。因此,结果计数将为0—对于组,有0行与筛选器匹配。
添加分组列时,SQLServer必须执行相同的计数,但现在按该列的每个不同值分组。由于您的筛选器不返回分组列的任何值,因此没有要创建的组。所以结果是没有记录。
所以两组的差别是0组对1组。无结果vs结果。
4sup72z82#
没有
GROUP BY
总是返回一行。过滤掉所有行后,行上的大多数值NULL
. 例外情况是COUNT()
价值观0
.具有
GROUP BY
为每个值组合返回一行。当筛选出所有行时,没有组,因此不返回任何内容。您的第一个查询具有
GROUP BY
但过滤掉所有行。因此,没有行。第二个查询没有GROUP BY
,因此返回一行。