2012-02-09 13 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 tableLa concatenación de múltiples filas en una sola línea en MS Access

Actualmente tengo una estructura de tabla que es algo como esto:

Nombre --- --- gatola descripción - - Thresh --- Perc --- Err --- BP
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- ADC2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 2 ----- BAC2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- RBE2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 8 ----- VBE2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 6 ----- AEC2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- PBC2
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 1 ----- XBC4
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- AEC2
Bob ------- 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

Lo que quiero hacer es tener 1 línea por "Nombre" y por "Gato", que resumirá todos los "Err" (por "Nombre" y "Gato") y solo concatenará los campos "BP" en una sola línea. Tales como:

Nombre --- Cat --- la descripción --- Thresh --- Perc --- Err --- BP
Bob - ------ 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

Se han formulado preguntas similares, pero parece que no puedo aplicarlo ya que mi conocimiento de las secuencias de comandos VBA es para principiantes. ¿Hay alguna manera de hacer todo esto a través de SQL? Si las secuencias de comandos de VBA son la única opción (es decir, crear una función), cualquier ayuda sería muy apreciada. Gracias de antemano.

Pregunta, parte 2:
Creé la función de acuerdo con la guía de Allen Browne. El módulo se guarda como modConcatRelated. Ahora, he tratado de ejecutar esta consulta (no estoy seguro si este es el SQL correcto para obtener el resultado que estoy buscando):.

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]; 

Se dice "Error 3061. Muy pocos parámetros esperados 1. " También decía "Función no definida ConcatRelated". Estoy buscando una guía sobre cómo crear la declaración SQL correcta para que pueda llamar a la función ConcatRelated correctamente y obtener el resultado como se muestra arriba. Gracias de nuevo.

siguiente pregunta:
¿Y si la mesa tenía un campo de fecha única etiquetados como en la última columna de la tabla. Algo como esto:

Nombre --- --- gatola descripción --- --- ThreshPerc --- Err --- --- BPFecha

Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0- ---- ADC2--12/02/2011
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05- ---- -2 ----- BAC2-09/05/2011
Bob ------- C1 ------- Inf -------- 7Per ------- -0.05 ------ 0 ----- RBE2--11/02/2011
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 8 ----- VBE2--08/14/2012
Bob ------- C1 ------- Inf-- ------ 7Per -------- 0.05 ------ 6 ----- AEC2--02/25/2009
Bob ------- 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
Bob ------- 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
Bob ------- 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 ----- --- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- FLC2--3/19/2010
Joe --- ----- C1 ------- Inf --------- 7Per -------- 0.05 ------ 1 ----- KSC2--09/05/2011
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- JYC2--08/14/2012

Digamos que quería hacer una consulta para decir algo así como: muéstreme todos los registros aún dentro de este mismo formato:

Nombre --- Cat --- la descripción --- Thresh --- Perc --- Err --- BP
Bob ------ -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

Pero para un intervalo de fechas de 01/01/2009 hasta 09/31/2011

@HansUp podría ayudar con esto?

+0

se necesita una función definida por el usuario de VBA para esto. Allen Browne ha proporcionado uno, junto con un ejemplo detallado sobre cómo usarlo. http://allenbrowne.com/func-concat.html – HansUp

+0

ive siguió los pasos para compilar la función, pero ¿puede ayudarme a crear mi declaración de "selección" en función de lo que estoy buscando arriba? – JT2013

+0

@HansUp utilicé el enlace al que se refería – JT2013

Respuesta

5

Utilicé una subconsulta para el GRUPO BY que calcula la suma del error para cada grupo. Luego agregué la función ConcatRelated (from Allen Browne) con los campos devueltos por la subconsulta. Esta es la consulta y la salida (basado en datos de la muestra en make_table_bp) a partir de la consulta:

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; 

Los resultados de las consultas de este conjunto de resultados:

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 

Aviso I delimitada nombre, descripción y Err con corchetes en cada lugar donde se hizo referencia en la consulta. Todas son palabras reservadas (ver Problem names and reserved words in Access). Elija nombres diferentes para esos campos si es posible. De lo contrario, use los corchetes para evitar confundir el motor db.

Pero esto no funcionará a menos que/hasta que su copia de la función ConcatRelated sea reconocida por su motor de base de datos. No entiendo por qué no lo es; Seguí los mismos pasos que enumeró para almacenar el código de la función, y esto funciona bien en mi sistema.

Editar: Probé esa consulta con mi versión de la tabla, que tiene [Err] como tipo de datos numéricos. Suena como que el tuyo es texto en su lugar. En ese caso, le sugiero que cambie los suyos a numéricos también. No veo el beneficio de almacenar valores numéricos como texto en lugar de números reales.

Sin embargo, si está atascado con [Err] como texto, puede adaptar la consulta para manejarlo. Cambiar esta ...

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

a este ...

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

Ese cambio impidió la "coincidencia de tipos de datos en los criterios de la expresión" error cuando probé con [Err] como tipo de datos de texto. Sin embargo, también ha cambiado esto ...

Sum(q.[Err]) AS SumOfErr 

a este ...

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

AFAICT segundo cambio que no es estrictamente necesario.El motor de db parece dispuesto a aceptar números como texto cuando usted le pide que los Sume(). Sin embargo, prefiero transformarlos explícitamente en valores numéricos en lugar de depender del motor de base de datos para hacer la suposición correcta en mi nombre. El motor de db tiene otras cosas para tratar, así que trato de decirle exactamente lo que quiero.

Edit2: Si solo desea concatenar valores únicos, puede modificar la función ConcatRelated(). Encontrar a esta sección del código ...

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

y el cambio a este ...

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

cuando funciono lo anterior me sale el siguiente error: Error 3464: Tipo de datos en expresión de criterios desajuste .... cada campo tiene un tipo de datos de texto con la excepción del campo Perc, que es un número – JT2013

+0

usted es una ¡genio! Eso funcionó como un encanto! La única otra pregunta que tengo es: ¿hay alguna manera de tener solo registros disctinct creados en la columna concat_BP? – JT2013

+0

muchas gracias por su ayuda ... ¡tengo los datos exactamente de la manera que lo necesito! – JT2013

Cuestiones relacionadas