Tsql 什么是计数(*)%2=1

Tsql 什么是计数(*)%2=1,tsql,Tsql,我看到这样一个问题 select * from Table1 group by Step having count(*) % 2 = 1 拥有count(*)%2=1的诀窍是什么 有人能解释一下吗 编辑:什么是常用区域?这不是在检查每个步骤是否有奇数个条目吗?Well%是模运算符,它给出除法的剩余部分,因此当该数字正好可被2(偶数)整除时,它将给出0,当不可被2(例如,它是奇数)整除时,它将给出1。因此,查询基本上选择计数为奇数的元素(如上所述)。它将返回所有行数为奇数的步骤 计数(*)将对数

我看到这样一个问题

select *
from Table1
group by Step
having count(*) % 2 = 1
拥有count(*)%2=1的诀窍是什么

有人能解释一下吗


编辑:什么是常用区域?

这不是在检查每个步骤是否有奇数个条目吗?

Well%是模运算符,它给出除法的剩余部分,因此当该数字正好可被2(偶数)整除时,它将给出0,当不可被2(例如,它是奇数)整除时,它将给出1。因此,查询基本上选择计数为奇数的元素(如上所述)。

它将返回所有行数为奇数的步骤

计数(*)将对数据库中的所有行进行计数。%是模数字符,它将为您提供除法问题的剩余部分。这就是将所有行除以2,然后返回剩余部分为1的行(表示奇数行)

正如Erik指出的,这不是所有的行,而是按步骤分组的行,这意味着每一步都是奇数行。

这样做的原因:


假设您想将奇数和偶数条目分为两列。其中一个可以用偶数,另一个可以用奇数


我也在评论中提到了这一点,但没有得到回应。

我们不可能在不知道这些表格的用途的情况下回答您的问题

对于给定的“步骤”,可能需要有等量的“某物”,这将生成一个元素列表,以显示在某些界面中,但实际情况并非如此

例如: 让我们暂时忘记“步骤”,假设这是一张学生表,而“步骤”是学生分成的“组”。一个小组的一个要求是学生人数为偶数,因为学生将成对工作。对于管理工具,您可以编写这样的查询,以查看不符合此条件的组列表

组别:Count A、 十, B、 九, C、 十七, D、 八, E、 四, F、 五,


感谢大家,查询将返回B、C、F组。大家都说查询返回的分组行数为奇数

但这不是重点!我将继续检查这个案例,并在程序员的头脑中写下原因(如果我找到谁写的话)

经验教训:程序员必须对这样愚蠢的逻辑写评论…

只要测试一下就可以了

declare @t1 table (step char(1))
insert into @t1(step)
select 'a'
union all select 'b'
union all select 'b'
union all select 'c'
union all select 'c'
union all select 'c'
union all select 'd'
union all select 'd'
union all select 'd'
union all select 'd'


select * from @t1
group by step
having count(*)%2 = 1
这将返回存在的列步骤的值添加次数

在本例中,它将返回

'a'
'c'
然而,
select*
在这里很混乱,我更愿意这样写

select step from @t1
group by step
having count(*)%2 = 1
甚至为了更大的可视性

select step, count(*) from @t1
group by step
having count(*)%2 = 1

这是什么?下面的答案是正确的,但是,我很惊讶它在群组中使用SELECT*运行。这在MS SqlServer中不起作用,因为您无法选择任何不是按分组或聚合的内容。@Robin Day:我知道这将运行的唯一方法是,如果
表1
中的唯一列是
步骤
问题不在于查询本身。。。我想知道写这样一个查询的原因是什么?我认为在这个例子中使用“select*”非常令人困惑。如果将其替换为“选择步骤”,则在表格中添加新列时,将更易于阅读且不容易出错OK我理解什么是模块运算符。但我不是问这个!诀窍是什么,程序员为什么使用这个语句,它背后的模式是什么?等等。诀窍是选择其他每一个元素(特别是赔率)——就这么简单。如果你想知道他们为什么这样做,这可能取决于上下文(例如,他们到底选择了什么?)。假设你想将奇数项和偶数项分为两列。其中一个可以用偶数,另一个可以用奇数。这有帮助吗?它将按步骤分组计算行数。谢谢,我没有注意到按步骤分组。我不认为逻辑错误,它只是编码错误。如果开发人员使用step而不是*代码将是不言自明的,不需要注释,请参阅我的答案了解详细信息欢迎您,我必须承认,当我第一次看到代码时,我不确定发生了什么,这是因为使用了“select*”