Как создать вычисляемый столбец в Access 2013 для обнаружения дубликатов - PullRequest
0 голосов
/ 28 мая 2020

Я воссоздаю инструмент, который я сделал в Excel , поскольку он становится больше и производительность выходит из-под контроля.

Проблема в том, что у меня только MS Access 2013 на моем рабочем ноутбуке, и я новичок в Expression Builder в Access 2013 , который имеет очень ограниченную функциональную базу, если честно.

У моих данных есть дубликаты в столбце [Местоположение] , что означает, что у меня есть несколько SKU на этом складе. Однако некоторые из моих расчетов нужно выполнять только один раз на [Местоположение] . Мое решение в Excel заключалось в том, чтобы создать формулу (см. Ниже), поставив 1 только при первом появлении этого местоположения, а 0 при следующих появлениях. Это работает как шарм, потому что суммирование по столбцу [Duplicate] при наложении нескольких критериев возвращает количество вхождений нескольких критериев, подсчитывающих местоположения только один раз.

Теперь, MS В Access 2013 Expression Builder нет функций SUM и COUNT для создания вычисляемого столбца, имитирующего мой [Duplicate] столбец из Excel . Желательно, чтобы я просто вводил необработанные данные и позволял Access заполнять вычисляемые поля, а также вводить вычисляемые поля, так как это нарушит мою первоначальную цель по снижению вычислительных затрат на создание моей информационной панели.

Вопрос в том, как создать вычисляемый столбец в MS Access 2013 Expression Builder , чтобы воссоздать приведенную ниже функцию Excel :

= IF ($ D $ 2: $ D3 = $ D4,0,1)

Ради уменьшения размера файла (более 100 тыс. Строк) я даже заменяю 0 на пробел "" .

Заранее благодарим за помощь

Y

1 Ответ

1 голос
/ 28 мая 2020

Прежде всего, поймите, что MS Access Expression Builder - это удобный инструмент для создания выражений SQL. В конечном итоге все в Query Design предназначено для построения запроса SQL. По этой причине вы должны использовать менталитет, основанный на наборах, чтобы видеть данные в виде целых наборов связанных таблиц, а не мышление по ячейкам.

В частности, чтобы достичь:

поставить 1 только при первом появлении этого места, поставить 0 при следующих появлениях

Рассмотрим весь набор- подход, основанный на присоединении к отдельному агрегатному запросу для определения первого значения вашей необходимой группировки, а затем вычисления необходимого выражения IIF. Ниже предполагается, что у вас есть поле автонумерации или первичного ключа в таблице (стандарт в реляционных базах данных):

Aggregate Query (сохранить как отдельный запрос, при необходимости настроить столбцы)

SELECT ColumnD, MIN(AutoNumberID) As MinID
FROM myTable
GROUP BY ColumnD

Окончательный запрос (присоединиться к исходной таблице и построить окончательное IIF выражение)

SELECT m.*, IIF(agg.MinID = AutoNumberID, 1, 0) As Dup_Indicator
FROM myTable m
INNER JOIN myAggregateQuery agg
   ON m.[ColumnD] = agg.ColumnD

Для демонстрации со случайными данными:

Исходный

| ID | GROUP  | INT | NUM          | CHAR | BOOL  | DATE       |
|----|--------|-----|--------------|------|-------|------------|
| 1  | r      | 9   | 1.424490258  | B6z  | TRUE  | 7/4/1994   |
| 2  | stata  | 10  | 2.591235683  | h7J  | FALSE | 10/5/1971  |
| 3  | spss   | 6   | 0.560461966  | Hrn  | TRUE  | 11/27/1990 |
| 4  | stata  | 10  | -1.499272175 | eXL  | FALSE | 4/17/2010  |
| 5  | stata  | 15  | 1.470269177  | Vas  | TRUE  | 6/13/2010  |
| 6  | r      | 14  | -0.072238898 | puP  | TRUE  | 4/1/1994   |
| 7  | julia  | 2   | -1.370405263 | S2l  | FALSE | 12/11/1999 |
| 8  | spss   | 6   | -0.153684675 | mAw  | FALSE | 7/28/1977  |
| 9  | spss   | 10  | -0.861482674 | cxC  | FALSE | 7/17/1994  |
| 10 | spss   | 2   | -0.817222582 | GRn  | FALSE | 10/19/2012 |
| 11 | stata  | 2   | 0.949287754  | xgc  | TRUE  | 1/18/2003  |
| 12 | stata  | 5   | -1.580841322 | Y1D  | TRUE  | 6/3/2011   |
| 13 | r      | 14  | -1.671303816 | JCP  | FALSE | 5/15/1981  |
| 14 | r      | 7   | 0.904181025  | Rct  | TRUE  | 7/24/1977  |
| 15 | stata  | 10  | -1.198211174 | qJY  | FALSE | 5/6/1982   |
| 16 | julia  | 10  | -0.265808162 | 10s  | FALSE | 3/18/1975  |
| 17 | r      | 13  | -0.264955027 | 8Md  | TRUE  | 6/11/1974  |
| 18 | r      | 4   | 0.518302149  | 4KW  | FALSE | 9/12/1980  |
| 19 | r      | 5   | -0.053620183 | 8An  | FALSE | 4/17/2004  |
| 20 | r      | 14  | -0.359197116 | F8Q  | TRUE  | 6/14/2005  |
| 21 | spss   | 11  | -2.211875193 | AgS  | TRUE  | 4/11/1973  |
| 22 | stata  | 4   | -1.718749471 | Zqr  | FALSE | 2/20/1999  |
| 23 | python | 10  | 1.207878576  | tcC  | FALSE | 4/18/2008  |
| 24 | stata  | 11  | 0.548902226  | PFJ  | TRUE  | 9/20/1994  |
| 25 | stata  | 6   | 1.479125922  | 7a7  | FALSE | 3/2/1989   |
| 26 | python | 10  | -0.437245299 | r32  | TRUE  | 6/7/1997   |
| 27 | sas    | 14  | 0.404746106  | 6NJ  | TRUE  | 9/23/2013  |
| 28 | stata  | 8   | 2.206741458  | Ive  | TRUE  | 5/26/2008  |
| 29 | spss   | 12  | -0.470694096 | dPS  | TRUE  | 5/4/1983   |
| 30 | sas    | 15  | -0.57169507  | yle  | TRUE  | 6/20/1979  |

SQL (использует агрегат в подзапросе, но может быть сохраненным запросом)

SELECT r.*, IIF(sub.MinID = r.ID,1, 0) AS Dup
FROM Random_Data r
LEFT JOIN 
   (
      SELECT r.GROUP, MIN(r.ID) As MinID
      FROM Random_Data r
      GROUP BY r.Group
   )  sub

ON r.[Group] = sub.[GROUP] 

Вывод (обратите внимание, что первое значение GROUP помечено как 1, все остальные 0)

| ID | GROUP  | INT | NUM          | CHAR | BOOL  | DATE       | Dup |
|----|--------|-----|--------------|------|-------|------------|-----|
| 1  | r      | 9   | 1.424490258  | B6z  | TRUE  | 7/4/1994   | 1   |
| 2  | stata  | 10  | 2.591235683  | h7J  | FALSE | 10/5/1971  | 1   |
| 3  | spss   | 6   | 0.560461966  | Hrn  | TRUE  | 11/27/1990 | 1   |
| 4  | stata  | 10  | -1.499272175 | eXL  | FALSE | 4/17/2010  | 0   |
| 5  | stata  | 15  | 1.470269177  | Vas  | TRUE  | 6/13/2010  | 0   |
| 6  | r      | 14  | -0.072238898 | puP  | TRUE  | 4/1/1994   | 0   |
| 7  | julia  | 2   | -1.370405263 | S2l  | FALSE | 12/11/1999 | 1   |
| 8  | spss   | 6   | -0.153684675 | mAw  | FALSE | 7/28/1977  | 0   |
| 9  | spss   | 10  | -0.861482674 | cxC  | FALSE | 7/17/1994  | 0   |
| 10 | spss   | 2   | -0.817222582 | GRn  | FALSE | 10/19/2012 | 0   |
| 11 | stata  | 2   | 0.949287754  | xgc  | TRUE  | 1/18/2003  | 0   |
| 12 | stata  | 5   | -1.580841322 | Y1D  | TRUE  | 6/3/2011   | 0   |
| 13 | r      | 14  | -1.671303816 | JCP  | FALSE | 5/15/1981  | 0   |
| 14 | r      | 7   | 0.904181025  | Rct  | TRUE  | 7/24/1977  | 0   |
| 15 | stata  | 10  | -1.198211174 | qJY  | FALSE | 5/6/1982   | 0   |
| 16 | julia  | 10  | -0.265808162 | 10s  | FALSE | 3/18/1975  | 0   |
| 17 | r      | 13  | -0.264955027 | 8Md  | TRUE  | 6/11/1974  | 0   |
| 18 | r      | 4   | 0.518302149  | 4KW  | FALSE | 9/12/1980  | 0   |
| 19 | r      | 5   | -0.053620183 | 8An  | FALSE | 4/17/2004  | 0   |
| 20 | r      | 14  | -0.359197116 | F8Q  | TRUE  | 6/14/2005  | 0   |
| 21 | spss   | 11  | -2.211875193 | AgS  | TRUE  | 4/11/1973  | 0   |
| 22 | stata  | 4   | -1.718749471 | Zqr  | FALSE | 2/20/1999  | 0   |
| 23 | python | 10  | 1.207878576  | tcC  | FALSE | 4/18/2008  | 1   |
| 24 | stata  | 11  | 0.548902226  | PFJ  | TRUE  | 9/20/1994  | 0   |
| 25 | stata  | 6   | 1.479125922  | 7a7  | FALSE | 3/2/1989   | 0   |
| 26 | python | 10  | -0.437245299 | r32  | TRUE  | 6/7/1997   | 0   |
| 27 | sas    | 14  | 0.404746106  | 6NJ  | TRUE  | 9/23/2013  | 1   |
| 28 | stata  | 8   | 2.206741458  | Ive  | TRUE  | 5/26/2008  | 0   |
| 29 | spss   | 12  | -0.470694096 | dPS  | TRUE  | 5/4/1983   | 0   |
| 30 | sas    | 15  | -0.57169507  | yle  | TRUE  | 6/20/1979  | 0   |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...