lunes, 19 de octubre de 2015

CELDA A VARIAS FILAS

A continuación se presenta en código una forma de pasar "bloques" de una sola cadena separada por comas (u otro caracter) a un formato de filas(a una tabla).

Una imagen podría ayudar a entender mejor lo que se quiere hacer.


Una cadena de Instrumentos:


Una cadena a varias filas


para pasar una cadena a varias filas como primer paso la cadena debe ser convertida a un XML, Hagamos un ejemplo con una cadena en una variable...


DECLARE @STR_INSTRUMENTOS  VARCHAR (500)
DECLARE @XML_INSTRUMENTOS  XML

la primer variable tendrá el texto con información separada por comas
la segunda variable es un tipo de dato XML donde se vaciará el texto ya separado

SET @STR_INSTRUMENTOS   = 'IPA BONOS IM, IPA BONOS IP, IPA BONOS IQ, IPA BONOS IS, IPA BONOS IT';

 -- PARA COVERTIR A XML
SET @XML_INSTRUMENTOS   CAST(('<Instrumento>' replace(@STR_INSTRUMENTOS,',','</Instrumento><Instrumento>')+'</Instrumento>') AS XML) 


Al revisar la variable, vemos que ya contiene la separación en un formato XML

SELECT @XML_INSTRUMENTOS
























Dentro del visor del XML se puede ver el formato del XML





Ahora lo único que se debe hacer es convertir el XML en Table,
es muy fácil, si quieres más detalle aquí te dejo un link  XML to TABLE 



SELECT A.value ('text()[1]','varchar(30)') as Instrumentos

FROM @XML_INSTRUMENTOS.nodes ('//Instrumento') as T(A)
















EJEMPLO COMPLETO:

DECLARE @STR_INSTRUMENTOS  VARCHAR (500)
DECLARE @XML_INSTRUMENTOS  XML

  
SET @STR_INSTRUMENTOS   = 'IPA BONOS IM, IPA BONOS IP, IPA BONOS IQ, IPA BONOS IS, IPA BONOS IT';
-- PARA COVERTIR A XML
SET @XML_INSTRUMENTOS   = CAST(('<Instrumento>'+replace(@STR_INSTRUMENTOS,',','</Instrumento><Instrumento>')+'</Instrumento>') AS XML) 

SELECT A.value ('.','varchar(30)') as Instrumentos

FROM @XML_INSTRUMENTOS.nodes ('Instrumento') as T1(A)














EJEMPLO 2

En éste ejemplo se van a separar en filas las columnas:
- ASOCIATE_INSTRUMENT
de la tabla que se muestra a continuación

Donde podemos ver que ya se tiene el XML a un lado de esa columa








ESTA ES LA CONSULTA DE LA TABLA SUPERIOR

SELECT [CLIENT_ID]   
      ,[ASOCIATE_INSTRUMENT]
      ,INSTRUMENTS = cast(('<IdItem>' + replace([ASOCIATE_INSTRUMENT],',','</IdItem><IdItem>') + '</IdItem>') AS XML)
      ,[INITIAL_AMOUNT_A]
      ,[FINAL_AMOUNT_A]
      ,[RATE_A]     
      ,[TOTAL_FEE]
  INTO #TEMP
  FROM [Avispa].[Avispa].[TARIFAS_COMISION_ACUMULADA]


LA CONSULTA SE METE EN UNA TABLA TEMPORAL, PARA POSTERIORMENTE EXTRAER UNA CONSULTA..-



  

El query anterior ya nos entrega los registros



SELECT  T2.Instruments,T1.*
FROM #TEMP          AS T1
CROSS APPLY (
                     SELECT A.value ('text()[1]','varchar(30)')                 as Instruments
                     FROM   T1.INSTRUMENTS.nodes ('IdItem')        as T(A)
                     ) AS T2

























No hay comentarios.:

Publicar un comentario