代码之家  ›  专栏  ›  技术社区  ›  Ozan BAYRAM

什么是count(*)%2=1

  •  6
  • Ozan BAYRAM  · 技术社区  · 16 年前

    我看到一个疑问

    select *
    from Table1
    group by Step
    having count(*) % 2 = 1
    

    技巧是什么 having count(*) % 2 = 1

    有人能解释吗?

    编辑:什么是常用区域?

    8 回复  |  直到 9 年前
        1
  •  21
  •   ternaryOperator    16 年前

    好的%是模运算符,它给出除法的余数,因此当数恰好可被2(偶数)除尽时,它会给出0,当数不可被1除尽时,它会给出0(例如,它是奇数)。所以查询基本上选择计数为奇数的元素(如上所述)。

        2
  •  15
  •   Reverend Gonzo    16 年前

    如果每个步骤的条目数都是奇数,是否不检查?

        3
  •  4
  •   Nitin Midha    16 年前

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

        4
  •  2
  •   kristof    16 年前

    只是测试一下

    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
    
        5
  •  1
  •   Hazior    16 年前

    这样做的原因:

    假设要将奇数和偶数项分隔为两列。你可以用偶数表示其中一个,奇数表示另一个。

    我也发表了评论,但没有得到回应。

        6
  •  1
  •   John M.    16 年前

    计数(*)将对数据库中的所有行进行计数。%是模数字符,它将给出除法问题的其余部分。所以这是将所有行除以2,并返回余数为1的行(即奇数行)。

    正如埃里克指出的,这不是所有的行,而是按步骤分组的行,这意味着这是每个步骤的所有奇数行。

        7
  •  1
  •   Christian V    16 年前

    我们不知道桌子是做什么用的,不可能回答你的问题。

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

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

    组:计数 A,10个 9 C,17 D,8 E,4 F,5

    查询将返回B、C、F组

        8
  •  0
  •   Ozan BAYRAM    16 年前

    谢谢大家。所有人都说,查询返回具有奇数计数的分组行。

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

    经验教训:程序员必须写一些关于愚蠢逻辑的评论…