2013-08-23 5 views
2

Использование Access 2010.запрос, который будет рассчитывать и увеличиваем количество повторяющихся экземпляров этой записи

Так что, если у меня есть таблица

COL1 
A  
B  
A  
C  
A  

и пробеге запрос я хотел бы получить выход в COL2 где «A» дублируется три раза, и его значение COL2, в свою очередь, увеличивается.

COL1 | COL2 
A | 1 
B | 1 
A | 2 
C | 1 
A | 3 
+2

В вашей таблице есть столбец идентификатора? Таблицы SQL по своей сути неупорядочены, поэтому вам нужен другой столбец для указания порядка. –

+0

Он легко может иметь идентификатор, который я удалил из примера для простоты - так, если у него есть id col любые идеи? – megaSteve4

ответ

3

Добавить поле к вашему столу. Выберите AutoNumber в качестве своего типа данных и сделайте его основным ключом таблицы. Я назвал поле ID, так что моя версия ваших данных образца выглядит следующим образом ...

ID COL1 
1 A 
2 B 
3 A 
4 C 
5 A 

SELECT заявление ниже возвращает этот результирующий набор ...

ID COL1 COL2a COL2b 
1 A  1  1 
2 B  1  1 
3 A  2  2 
4 C  1  1 
5 A  3  3 

COL2a и COL2b показать 2 метода для достижения того же результата. DCount - это специфичные для доступа и требуемые котировки вокруг значений текста m.COL1. Второй подход, COL2b, использует коррелированный подзапрос, поэтому он может работать в другой базе данных, если вы выберете. И с этим подходом вам не нужно будет беспокоиться о цитировании текстовых значений.

Любой подход требует, чтобы двигатель db запускал дополнительный запрос для каждой строки результирующего набора. Таким образом, с огромным столом производительность будет представлять собой проблему. Индексирование поможет там. Добавьте индекс на COL1, если его уже нет. ID уже имеет индекс, так как это первичный ключ.

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

SELECT 
    m.ID, 
    m.COL1, 
    DCount(
     "*", 
     "MyTable", 
     "COL1 = '" & m.COL1 & "' AND ID <= " & m.ID 
    ) AS COL2a, 
    (
     SELECT Count(*) 
     FROM MyTable AS m2 
     WHERE m2.COL1 = m.COL1 AND m2.ID <= m.ID 
    ) AS COL2b 
FROM MyTable2 AS m 
ORDER BY m.ID;