Доступ к SQL, как сделать приращение в запросе SELECT - PullRequest
2 голосов
/ 09 июня 2011

У меня есть SQL-запрос, дающий мне результаты X, я хочу, чтобы в выводе запроса был столбец count, что делает запрос примерно таким:

count id section
1     15    7
2     3     2
3     54    1
4     7     4

Как я могу это сделать?

Ответы [ 7 ]

2 голосов
/ 13 июня 2011

Я, честно говоря, не понимаю, что именно вы хотите, но если вам нужен только порядковый номер, отображаемый в вашей форме, вы можете использовать элемент управления, связанный со свойством формы CurrentRecord. Элемент управления с ControlSource =CurrentRecord будет иметь всегда точный «номер записи», который находится в последовательности и будет обновляться при изменении источника записей формы (что может или не может быть желательным).

Затем вы можете использовать этот номер для перемещения по форме, если хотите.

Но это может быть совсем не то, что вы ищете - я просто не могу сказать по вопросу, который вы разместили, и по "разъяснениям" в комментариях.

2 голосов
/ 09 июня 2011

Итак, в вашем примере "count" - это производный порядковый номер? Я не вижу, какой шаблон используется для определения количества должно быть 1 для id = 15 и 2 для id = 3.

count id section
1     15    7
2     3     2
3     54    1
4     7     4

Если идентификатор содержал уникальные значения, и вы заказывали по идентификатору, вы могли бы иметь это:

count id section
1     3     2
2     7     4
3     15    7
4     54    1

Мне кажется, что подход Майка к DSum может сработать. Или вы можете использовать другой подход к рейтинговому запросу, как Аллен Браун описал на этой странице

Редактировать : Вы можете использовать DCount вместо DSum. Я не знаю, как скорость будет сравниваться между ними, но DCount избегает создания поля в таблице просто для хранения 1 для каждой строки.

DCount("*","YourTableName","id<=" & [id]) AS counter

Независимо от того, используете ли вы DCount или DSum, значения счетчика могут содержать дубликаты, если значения идентификатора не являются уникальными. Если id является первичным ключом, не беспокойтесь.

1 голос
/ 09 июня 2011

Хорошо, я думаю, что это достаточно близко, чтобы составить ответ: следующая ссылка определяет два подхода: http://www.techrepublic.com/blog/microsoft-office/an-access-query-that-returns-every-nth-record/

Первый подход предполагает наличие идентификатора и использование DCount (аналог решения @ mikeY).

Второй подход предполагает, что вы в порядке, создавая функцию VBA, которая будет запускаться один раз для КАЖДОЙ записи в наборе записей, и ее необходимо будет сбрасывать вручную (с некоторыми VBA) каждый раз, когда вы хотите запустить счетчик - потому что он использует «статическое» значение для запуска его счетчика.

Пока у вас есть разумные цифры (сотни, а не тысячи) или записи, второй подход выглядит для меня самым простым / самым мощным.

1 голос
/ 09 июня 2011

Единственный трюк, который я видел, - если у вас есть поле с последовательным идентификатором, вы можете создать новое поле, в котором значение для каждой записи равно 1. Затем вы делаете промежуточную сумму для этого поля.

Добавьте к вашему запросу

DSum ("[Новое поле с 1 в нем]", "[Имя таблицы]", "[Поле идентификатора] <=" & [Поле идентификатора]) в качестве контратаки </p>

Это должно произвести последовательный подсчет в Access, что, я думаю, вам нужно.

HTH.

(Украдено у Роба Миллса здесь: http://www.access -programmers.co.ик / форумы / showthread.php? p = 160386 )

0 голосов
/ 12 августа 2017

автоинкремент в SQL

SELECT (Select COUNT(*) FROM table A where A.id<=b.id),B.id,B.Section FROM table AS B ORDER BY B.ID Asc
0 голосов
/ 10 января 2017

Эта функция может вызываться из каждой записи, если она доступна из модуля.

Пример: incrementingCounterTimeFlaged (10, [anyField]) должен предоставлять вашим строкам запроса значение int, увеличивающееся от 0.

'provides incrementing int values 0 to n
'resets to 0 some seconds after first call
Function incrementingCounterTimeFlaged(resetAfterSeconds As Integer,anyfield as variant) As Integer

Static resetAt As Date
Static i As Integer
'if reset date < now() set the flag and return 0

If DateDiff("s", resetAt, Now()) > 0 Then
    resetAt = DateAdd("s", resetAfterSeconds, Now())
    i = 0
    incrementingCounterTimeFlaged = i
'if reset date > now increments and returns
Else
    i = i + 1
    incrementingCounterTimeFlaged = i
End If    
End Function
0 голосов
/ 09 июня 2011

Вы можете использовать ROW_NUMBER () из SQL Server 2008

SELECT ROW_NUMBER() OVER (ORDER By ID DESC) RowNum,
    ID,
    Section
FROM myTable

Тогда RowNum отображает последовательность номеров строк.

...