2012-02-09 5 views
8

Possible Duplicate:
Combine rows in Access 2007
Access 2007 - Concatenate fields from one column in one table into a single, comma delmited value in another tableобъединения нескольких строк в одной строке в MS Access

В настоящее время у меня структуру таблицы, которая примерно так:

Имя --- Кошка --- Описание изделия - - Трэш --- Проц --- Err --- BP
Боб ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- ADC2
Боб ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 2 ----- BAC2
Боб ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- RBE2
Боб ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 8 ----- VBE2
Боб ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 6 ----- AEC2
Боб ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- PBC2
Боб ------- C2 ------- Com ------ 8Per -------- 0,45 ------ 1 ----- XBC4
Bob ------- C2 ------- Com ------ 8Per -------- 0,45 ------ 0 ----- AEC2
Боб ------- C2 ------- Com ------ 8Per -------- 0,45 ------ 0 ----- PBC2
Bob ------- C2 ------- Com ------ 8Per -------- 0,45 ------ 3 ----- ADC2
Bob - ----- C2 ------- Com ------ 8Per -------- 0,45 ------ 0 ----- ADC2
Bob ---- --- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- BAC2
Joe ------ --C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- PBC2
Joe ---- ---- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- ZTM2
Joe-- ------ C1 ------- Inf --------- 7Per -------- 0.05 ------ 2 ----- QYC2
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- FLC2
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 1 ----- KSC2
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 --- --JYC2

То, что я хочу сделать, это иметь 1 строку на «имя» и «кошку», которая суммирует все «Err» (по «Name» и «Cat») и объединяется только поля «BP» в одну строку. Такие, как:

Имя --- Cat --- Desc --- Трэш --- Проц --- Err --- BP
Боб - ------ C1 ------- Inf -------- 7Per -------- 0.05 ----- 16 ----- BAC2, VBE2, AEC2
Bob ------- C2 ------ Com ------ 8Per -------- 0.45 ------ 4 ------ XBC4, ADC2
Joe -------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 3 ------ QYC2, KSC2

Были заданы аналогичные вопросы, но я не могу их применить, поскольку мои знания о сценариях VBA начинаются. Есть ли способ сделать все это через SQL? Если скрипт VBA является единственным вариантом (т. Е. Созданием функции), любая помощь будет принята с большой благодарностью. Заранее спасибо.

Вопрос часть 2:
Я создал функцию в соответствии с руководством Аллена Брауна. Модуль сохраняется как modConcatRelated. Теперь, я пытался запустить этот запрос (Я не уверен, если это правильный SQL, чтобы получить результат, который я ищу):.

SELECT 
    [Name], 
    [Cat], 
    [Desc], 
    [Thresh], 
    [Perc], 
    sum([Err]), 
    ConcatRelated("[BP]", "make_table_bp", "[Err] = " & [BP]) 
FROM make_table_bp 
GROUP BY 
    [Name], 
    [Cat], 
    [Desc], 
    [Thresh], 
    [Perc], 
    [Err], 
    [BP]; 

Он сказал «Ошибка 3061. Слишком мало параметров Ожидаемые 1.» Также он сказал «Неопределенная функция ConcatRelated». Я ищу руководство по созданию правильной инструкции SQL, чтобы я мог правильно вызвать функцию ConcatRelated и дать результат, как показано выше. Еще раз спасибо.

Следующий вопрос:
Что делать, если таблица имеет уникальное поле даты присваиваемого в качестве последнего столбца в таблице. Что-то вроде этого:

Имя --- Cat --- Desc --- Трэш --- Проц --- Err --- BP --- Дата

Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0- ---- ADC2-12/02/2011
Боб ------- C1 ------- Inf -------- 7Per -------- 0.05- ---- -2 ----- BAC2--09/05/2011
Боб ------- C1 ------- Inf -------- 7Per ------- -0,05 ------ 0 ----- RBE2--11/02/2011
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 8 ----- VBE2--08/14/2012
Боб ------- C1 ------- Inf-- ------ 7Пер -------- 0.05 ------ 6 ----- AEC2--02/25/2009
Боб ------- C1 --- ---- Inf -------- 7Per -------- 0.05 ------ 0 ----- PBC2--07/02/2011
Bob ---- --- C2 ------- Com ------ 8Per -------- 0,45 ------ 1 ----- XBC4--09/05/2011
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- AEC2-02/02/2010
Боб ------- C2 ------- Com ------ 8Per -------- 0,45 ------ 0 ----- PBC2--08/14/2012
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 3 ----- ADC2-- 05/05/2001
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 --- --ADC2--08/02/2010
Боб ------- C2 ------- Com ------ 8Per -------- 0,45 ------ -0 ----- BAC2--06/17/2010
Joe -------- C1 ------- Inf --------- 7Per ----- --- 0.05 ------ 0 ----- PBC2--08/14/2012
Joe -------- C1 ------- Inf ------ --- 7Per -------- 0.05 ------ 0 ----- ZTM2--09/05/2011
Joe -------- C1 ----- --Inf --------- 7Per -------- 0.05 ------ 2 ----- QYC2--05/17/2010
Joe ----- --- С1 ------- Inf --------- -------- 7Per 0,05 ------ 0 ----- FLC2--3/19/2010
Joe --- ----- С1 ------- Inf --------- -------- 7Per 0,05 ------ 1 ----- KSC2--09/05/2011
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- JYC2--08/14/2012

Предположим, я хотел построить запрос, чтобы сказать что-то вроде: показать мне все записи, все еще в этом же формате:

Имя --- Cat --- Desc --- Трэш --- Проц --- Err --- BP
Боб ------ -C1 ------- Inf -------- 7Per -------- 0.05 ----- 16 ----- BAC2, VBE2, AEC2
Bob ------- C2 ------ Com ------ 8Per -------- 0.45 ------ 4 ------ XBC4, ADC2
Joe -------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 3 ----- -QYC2, KSC2

Но для диапазона дат 01/01/2009 до 09/31/2011

@HansUp могли бы вы помочь с этим?

+0

Вам нужен VBA пользовательскую функцию для этого. Аллен Браун предоставил один, а также подробный пример того, как его использовать. http://allenbrowne.com/func-concat.html – HansUp

+0

ive выполнил шаги по компиляции функции, но можете ли вы помочь мне создать мой оператор «select» на основе того, что я ищу выше? – JT2013

+0

@HansUp Я использовал ссылку, которую вы ссылались на – JT2013

ответ

5

Я использовал подзапрос для GROUP BY, который вычисляет сумму Err для каждой группы. Затем я добавил функцию ConcatRelated (from Allen Browne) с полями, возвращаемыми подзапросом. Это запрос, и выходной сигнал (на основе данных выборки в make_table_bp) из запроса:

SELECT 
    sub.[Name], 
    sub.Cat, 
    sub.[Desc], 
    sub.Thresh, 
    sub.Perc, 
    sub.SumOfErr, 
    ConcatRelated("BP", 
     "make_table_bp", 
     "[Err] > 0 AND [Name] = '" & sub.[Name] 
     & "' AND Cat = '" 
     & sub.Cat & "'", 
     "BP") 
     AS concat_BP 
FROM 
    (SELECT 
     q.[Name], 
     q.Cat, 
     q.[Desc], 
     q.Thresh, 
     q.Perc, 
     Sum(q.[Err]) AS SumOfErr 
    FROM make_table_bp AS q 
    GROUP BY 
     q.[Name], 
     q.Cat, 
     q.[Desc], 
     q.Thresh, 
     q.Perc 
    ) AS sub 
ORDER BY 
    sub.Name, 
    sub.Cat; 

запрос выводит этот результат набор:

Name Cat Desc Thresh Perc SumOfErr concat_BP 
Bob C1 Inf 7Per 0.05  16 AEC2, BAC2, VBE2 
Bob C2 Com 8Per 0.45  4 ADC2, XBC4 
Joe C1 Inf 7Per 0.05  3 KSC2, QYC2 

Примечания Я прилагается Имя, Описание изделия и Err с квадратными скобками в каждом месте, на которое они ссылались в запросе. Все зарезервированные слова (см. Problem names and reserved words in Access). Если возможно, выберите те или иные названия. Если нет, используйте квадратные скобки, чтобы избежать путаницы с двигателем.

Но это не сработает до тех пор, пока ваша копия функции ConcatRelated не будет распознана вашим двигателем базы данных. Я не понимаю, почему это не так; Я выполнил те же шаги, которые вы указали для хранения кода функции, и это отлично работает в моей системе.

Редактировать: Я проверил этот запрос с моей версией таблицы, которая имеет [Err] как числовой тип данных. Похоже, что ваш текст - это текст. В этом случае я также предлагаю вам изменить ваш на числовой. Я не вижу преимущества хранения числовых значений в виде текста вместо фактических чисел.

Однако, если вы застряли с текстом [Err], вы можете адаптировать запрос, чтобы справиться с ним. Измените это ...

"[Err] > 0 AND [Name] = '" & sub.[Name] 

к этому ...

"Val([Err]) > 0 AND [Name] = '" & sub.[Name] 

Это изменение помешало «несоответствие типов данных в выражении критериев» ошибка, когда я тестировал с [Err] как тип текстовых данных. Тем не менее, я изменил это ...

Sum(q.[Err]) AS SumOfErr 

к этому ...

Sum(Val(q.[Err])) AS SumOfErr 

AFAICT, что второе изменение не является строго необходимым.Кажется, что движок db желает принимать числа в виде текста, когда вы запрашиваете их для Sum(). Однако я предпочитаю явно преобразовывать их в числовые значения, а не зависеть от механизма db, чтобы сделать правильное предположение от моего имени. У движка db есть достаточно других вещей, с которыми можно справиться, поэтому я пытаюсь сказать именно то, что хочу.

Редактировать2: Если вы хотите, чтобы только уникальные значения были объединены, вы можете изменить функцию ConcatRelated(). Найти этот раздел кода ...

'Build SQL string, and get the records. 
strSql = "SELECT " & strField & " FROM " & strTable 

и изменить его к этому ...

'Build SQL string, and get the records. 
strSql = "SELECT DISTINCT " & strField & " FROM " & strTable 
+0

, когда я запускаю выше, я получаю следующую ошибку: Ошибка 3464: несоответствие типов данных в выражении критериев .... каждое поле имеет тип данных Text, за исключением поля Perc, которое является числом – JT2013

+0

, вы являетесь гений! Это работало как шарм! Единственный другой вопрос, который у меня есть, заключается в следующем: существует ли способ иметь только отчетливые записи, созданные в столбце concat_BP? – JT2013

+0

Большое вам спасибо за вашу помощь ... У меня есть данные точно так, как они мне нужны! – JT2013

Смежные вопросы