что такое количество (*)% 2 = 1 - PullRequest
6 голосов
/ 06 января 2010

Я вижу запрос вроде

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

В чем подвох having count(*) % 2 = 1

Может кто-нибудь объяснить?

edit: Каковы общие области использования?

Ответы [ 8 ]

21 голосов
/ 06 января 2010

Well% - это оператор по модулю, который дает остаток от деления, поэтому он будет давать 0, когда число точно делится на 2 (четное), и 1, если нет (например, это нечетное). Таким образом, запрос в основном выбирает элементы, для которых количество нечетно (как сказано выше).

15 голосов
/ 06 января 2010

Разве это не будет проверкой, если у вас есть нечетное количество записей на шаг?

4 голосов
/ 06 января 2010

Он вернет все шаги с нечетным числом строк.

2 голосов
/ 06 января 2010

просто протестируйте

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
1 голос
/ 06 января 2010

Мы не можем ответить на ваш вопрос, не зная, для чего используются таблицы.

Для данного «шага» может потребоваться равное количество «чего-то», и это приведет к созданию списка элементов, которые будут отображаться в некотором интерфейсе, где это не так.

Пример: Давайте на мгновение забудем «Шаги» и предположим, что это был стол студентов, а «Шаг» вместо «Группы», на которые делятся студенты. Требование к группе - наличие четного числа студентов, потому что они будут работать в парах. Для административного инструмента вы можете написать такой запрос, чтобы увидеть список групп, где это не так.

Группа: граф А, 10 Б, 9 С, 17 Д, 8 Е, 4 F, 5

И запрос вернет группы B, C, F

1 голос
/ 06 января 2010

Причина для этого:

Допустим, вы хотите разделить нечетные и четные записи на два столбца. Вы можете использовать четное для одного из них и нечетное для другого.

Я также добавил это в комментарии, но не получил ответа.

1 голос
/ 06 января 2010

COUNT (*) будет считать все строки в базе данных. % Является символом модуля, который даст вам остальную часть проблемы деления. Таким образом, это делит все строки на две и возвращает те, которые имеют остаток от 1 (что означает нечетное количество строк).

Как указал Эрик, это будут не все строки, а те, которые сгруппированы по шагам, то есть все нечетные строки на шаг.

0 голосов
/ 06 января 2010

Спасибо всем. Все вы сказали, что запрос возвращает сгруппированные строки с нечетным числом.

но это не главное! я продолжу проверять этот случай и напишу причину в уме программиста (если я найду, кто это пишет)

Извлеченные уроки: программисты должны писать комментарии о такой глупой логике ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...