Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

apoyo con query

Estas en el tema de apoyo con query en el foro de SQL Server en Foros del Web. Hola a todos me podrian apoyar ya que tengo un campo con pipe y necesito separar los datos cada uno en un campo distinto ejemplo: ...
  #1 (permalink)  
Antiguo 23/02/2010, 16:09
 
Fecha de Ingreso: febrero-2010
Mensajes: 5
Antigüedad: 14 años, 2 meses
Puntos: 0
apoyo con query

Hola a todos me podrian apoyar ya que tengo un campo con pipe y necesito separar los datos cada uno en un campo distinto ejemplo:

CAMPO1
JUAN|MANUEL|TREJO|GOMEZ|1|MARA|ESCARLET|DE LA MORA|LUNA|1

RESULTADO

C1 C2 C3 C4 C5
JUAN MANUEL TREJO GOMEZ 1

POR FAVOR ALGUIEN ME PODRIA AYUDAR CON ESTA CONSULTA YA QUE DESCONOZCO COMO HACERLO EN SQL SERVER Y ES NECESARIO HACERLO DESDE SQL.
  #2 (permalink)  
Antiguo 23/02/2010, 21:34
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Respuesta: apoyo con query

¿Qué versión de SQL Server estás usando?
¿cuentas con una tabla auxiliar de números?

Acabo de notar que como resultado sólo indicas lo que corresponde a los primeros cinco segmentos. ¿ignorarás el resto? Si es así, entonces basta con que uses una combinación de CHARINDEX y SUBSTRING.

Si por otra parte, cada 5 bloques representan una fila y debes mostrar todas las filas como en
Código:
+-----+---------+-----------+------+---+
|C1   |C2       |C3         |C4    |C5 |
+-----+---------+-----------+------+---+
|JUAN |MANUEL   |TREJO      |GOMEZ |1  |
+-----+---------+-----------+------+---+
|MARA |ESCARLET |DE LA MORA |LUNA  |1  |
+-----+---------+-----------+------+---+
el asunto es diferente, y puede solucionarse con una tabla de números, expresiones case o quizá pivot si tienes SQL Server 2005.

Última edición por Beakdan; 24/02/2010 a las 01:02 Razón: .
  #3 (permalink)  
Antiguo 24/02/2010, 09:04
 
Fecha de Ingreso: febrero-2010
Mensajes: 5
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: apoyo con query

Es exactamente el segundo caso, la version que tengo es SQL SERVER 2005 tal y como lo planteaste es asi, la verdad es que no tengo idea de como hacerlo tiene demasiado tiempo que no uso SQL por favor ayudame, te lo agradeceria mucho.
  #4 (permalink)  
Antiguo 25/02/2010, 04:57
 
Fecha de Ingreso: enero-2010
Ubicación: Sevilla
Mensajes: 202
Antigüedad: 14 años, 3 meses
Puntos: 5
Respuesta: apoyo con query

Puedes utilizar una función split, para separar cada parte de una cadena con delimitadores, como es tu caso.
Aquí tienes una http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=50648
__________________
Mi blog de temas más o menos técnicos

Y aquí el Jamón jamon de Jabugo
  #5 (permalink)  
Antiguo 25/02/2010, 10:11
 
Fecha de Ingreso: febrero-2010
Mensajes: 5
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: apoyo con query

habria alguna sentencia para hacerlo con una tabla de números, expresiones case o quizá pivot como ya lo habian propuesto??
Me parece mas factible para mi caso ya que tengo una tabla con 59 PIPE y cada uno lo necesito ingresar a un campo, este me debe respetar lo espacios vacios como son personas con un solo nombre. ejemplo: TREJO|GOMEZ|JUAN|_|1| (TREJO GOMEZ JUAN _ 1).
  #6 (permalink)  
Antiguo 26/02/2010, 03:42
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Respuesta: apoyo con query

No has puesto más detalles de la estructura de la tabla de donde tomas los datos, así que he tenido que improvisar para tener una estructura para probar. Como te había comentado, me parece que una solución con una tabla auxiliar de números sería más adecuada en términos de performance. Sobre la misma línea de performance, trata de evitar cursores o bucles while.
Ya que estás usando SQL Server 2005, puedes usar funciones XML, te pongo un ejemplo:

Código:
DECLARE @t AS TABLE(
 Id  INT NOT NULL,
 Campo1 VARCHAR(1000)
);
INSERT INTO @t
SELECT 1, 'JUAN|MANUEL|TREJO|GOMEZ|1|MARA|ESCARLET|DE LA MORA|LUNA|1' UNION ALL
SELECT 2, 'FERNANDO||CERVANTES|FIGUEROA|5' UNION ALL
SELECT 3, 'BENITO||PEREZ|GALDOS|3|PEDRO|ANTONIO|DE ALARCÓN||4';
WITH pre AS (
 SELECT Id, CAST('<x>' + REPLACE(Campo1, '|', '</x><x>')+ '</x>' AS XML) AS Campo1
 FROM @t
)
SELECT Id, [0] AS C1, [1] AS C2, [2] AS C3, [3] AS C4, [4] AS C5
FROM (
   SELECT  Id,
      (x.rn - 1) / 5 AS Row,
      (x.rn - 1) % 5 AS Col,
      x.c
   FROM  pre
      CROSS APPLY (
       SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) as rn,
         x.c.value('.', 'VARCHAR(30)') AS c
       FROM pre.Campo1.nodes('/x') AS x(c)
      ) AS x
  ) AS DAT
PIVOT (MAX(c) FOR Col IN([0], [1], [2], [3], [4])) AS pvt
ORDER BY Id
OPTION (MAXDOP 1);
Sugiero que te documentes sobre como resolver (y como no resolver) esta clase de problemas buscando palabras clave como RBAR, Set-Based logic, resolviendo algunos puzzles de SQL como los que tiene Joe Celko en su libro SQL for Smarties, o los problemas del sitio Beyond Relational.
  #7 (permalink)  
Antiguo 26/02/2010, 11:29
 
Fecha de Ingreso: febrero-2010
Mensajes: 5
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: apoyo con query

Esto es lo que necesitaba muchas gracias!!!!!!!! , claro solo me falta adaptarlo ya que tengo una tbla con el campo folio y otra con el campo NOMBRES y en nombres es donde necesito separarlos, te agradezco mucho.......

Etiquetas: query
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:06.