none
Como puedo unir el mismo campo de dos diferentes registros (del resultado de una consulta)? RRS feed

  • Pregunta

  • Hola,

    Creo que mi pregunta sonará extraña, pero espero poder aclararla:

    Necesito hacer un Query a partir de una única tabla.  En esta tabla hay 6 campos:

    • uri
    • n3TableId
    • n3TableUri
    • n3Chunk
    • n3Text
    • n3Length

    Necesito obtener todos los registros que en n3TableId tengan un valor de 160  y mostrar los campos uri, n3TableId, n3TableUri y n3Text.

    Con esta sentencia puedo obtenerlo

    SELECT uri, n3TableId, n3TableUri, n3Text FROM TSnotes3 WITH (NOLOCK)
    WHERE n3TableId = 160
    ORDER BY n3TableUri ASC, n3TableId ASC, n3Chunk ASC

    Hasta ahí todo bien y obtengo un resultado como este:


    uri n3TableId n3TableUri n3Text
    26 160 15  ''miércoles, diciembre 19, 2012 a las 5:14:29 PM (GMT-06:00)    Supervisor:''Se estableció en 'No completada'. Motivo: g''miércoles, diciembre 19, 2012 a las 5:17:27 PM (GMT-06:00)    Supervisor:''Se estableció en '
    28 160 15  No completada'. Motivo: g
    7 160 23  ''martes, diciembre 18, 2012 a las 8:38:35 AM (GMT-06:00)   Supervisor:''Se estableció en 'No completada'. Motivo: dfdf
    4 160 27  ''viernes, diciembre 14, 2012 a las 10:30:04 AM (GMT-06:00)   Supervisor:''Autorizado
    11 160 35  ''martes, 18 de diciembre de 2012 a las 10:36:03 a.m. (GMT-06:00)   :''516526526''martes, 18 de diciembre de 2012 a las 10:23:10 a.m. (GMT-06:00), ''Se hizo retroceder a: Crear Motivo: Se
    15 160 35  seleccionó un resultado de retroceso para la Actividad: Revisa''martes, 18 de diciembre de 2012 a las 10:29:52 a.m. (GMT-06:00), ''Se hizo retroceder a: Crear Motivo: Se seleccionó un resultado de
    16 160 35   retroceso para la Actividad: Revisa
    10 160 36  ''martes, 18 de diciembre de 2012 a las 10:23:10 a.m. (GMT-06:00)   ''Se estableció en 'No completada'. Motivo: Debido a que la Actividad Revisa se hizo retroceder.''martes, 18 de diciembre de 2012 a la
    13 160 36  s 10:26:21 a.m. (GMT-06:00)  ''Nota de Prueba''martes, 18 de diciembre de 2012 a las 10:29:52 a.m. (GMT-06:00), ''Se estableció en 'No completada'. Motivo: Debido a que la Actividad  R
    14 160 36  evisa se hizo retroceder.
    8 160 38  ''martes, diciembre 18, 2012 a las 10:31:52 AM (GMT-06:00)   Supervisor:''''martes, diciembre 18, 2012 a las 10:22:43 AM (GMT-06:00)  Supervisor:''Autorizado''martes, 18 de diciembre de 2012 a las 10:23:10 a.
    9 160 38  m. (GMT-06:00)   ''Se estableció en 'No completada'. Motivo: Debido a que la Actividad  Revisa se hizo retroceder.'' martes, diciembre 18, 2012 a las 10:32:08 AM (GMT-06:00)  Supervisor:''Autoriza
    12 160 38  do''martes, 18 de diciembre de 2012 a las 10:29:52 a.m. (GMT-06:00)   ''Se estableció en 'No completada'. Motivo: Debido a que la Actividad Revisa se hizo retroceder.'' martes, diciembre 18, 2012 a l
    17 160 38  as 11:03:33 AM (GMT-06:00)   Supervisor:''Autorizado
    18 160 42  ''martes, diciembre 18, 2012 a las 11:08:41 AM (GMT-06:00)  Supervisor:''Autorizado

    Si observan los dos primeros registros tienen el mismo valor en n3TableUri, la razón es que el segundo es continuación del primero.   Lo que necesito es que me muestre un solo registro por valor que exista en n3TableUri y que los valores de n3Text se muestren concatenados en un solo campo. (Pueden existir 1 o más registros que deben concatenarse y todo parte del campo n3TableUri)

    Lamentablemente no tengo forma de modificar el programa que genera los datos para esta tabla y tampoco puedo alterar la longitud en el campo n3Text.

    Hay forma de que los datos se muestren como necesito?

    De antemano muchas gracias por su ayuda.

    viernes, 22 de noviembre de 2019 15:50

Respuestas

  • Si la versión de SQL Server es 2017 (o posterior) se puede utilizar la función STRING_AGG(), si es anterior se puede utilizar la función STUFF().  

    -- código #1
    SELECT n3TableId, n3TableUri, 
           string_agg (n3Text, ';') within group (order by uri) as Text
      from TSnotes3 
      where n3TableId = 160
      group by n3TableId, n3TableUri;
     

    La columna uri no puede visualizarse individualmente, en los casos en que exista más de una fila para el mismo valor de { n3TableId, n3TableUri }.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz viernes, 22 de noviembre de 2019 16:23
    • Propuesto como respuesta Pablo RubioModerator viernes, 22 de noviembre de 2019 16:26
    • Marcado como respuesta Odlarhg viernes, 22 de noviembre de 2019 17:04
    viernes, 22 de noviembre de 2019 16:20

Todas las respuestas

  • Si la versión de SQL Server es 2017 (o posterior) se puede utilizar la función STRING_AGG(), si es anterior se puede utilizar la función STUFF().  

    -- código #1
    SELECT n3TableId, n3TableUri, 
           string_agg (n3Text, ';') within group (order by uri) as Text
      from TSnotes3 
      where n3TableId = 160
      group by n3TableId, n3TableUri;
     

    La columna uri no puede visualizarse individualmente, en los casos en que exista más de una fila para el mismo valor de { n3TableId, n3TableUri }.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz viernes, 22 de noviembre de 2019 16:23
    • Propuesto como respuesta Pablo RubioModerator viernes, 22 de noviembre de 2019 16:26
    • Marcado como respuesta Odlarhg viernes, 22 de noviembre de 2019 17:04
    viernes, 22 de noviembre de 2019 16:20
  • Muchas gracias, logré resolver el problema con tu ayuda.

    Saludos,

    viernes, 22 de noviembre de 2019 17:04