locked
Convertir la estructura de un archivo TXT en una tabla SQL

    Question

  • Hola amigos,

    Les escribo para solicitar su ayuda por el siguiente problema que tengo:

    Diariamente me envían un archivo TXT con la siguiente estructura:

    Fecha Vendedor Articulo Volumen
    25-ene-10 A. Sánchez 1 6015.99
    25-ene-10 A. Sánchez 22 2666.25
    25-ene-10 A. Sánchez 333 3456.74
    25-ene-10 B. Blanco 1 6942.94
    25-ene-10 B. Blanco 22 6081.12
    25-ene-10 B. Blanco 333 7603.97
    25-ene-10 D. Soto 1 5899.69
    25-ene-10 D. Soto 22 5066.08
    25-ene-10 D. Soto 333 692.09
    25-ene-10 J. Pérez 1 8546.21
    25-ene-10 J. Pérez 22 5125.37
    25-ene-10 J. Pérez 333 3648.45
    25-ene-10 R. Lugo 1 5803.91
    25-ene-10 R. Lugo 22 2908.70
    25-ene-10 R. Lugo 333 1214.07

    Como se puede observar, son 5 vendedores con 3 artículos diferentes (es un ejemplo resumido, porque en la vida real son mas de 500 vendedores y 20 Artículos). Cabe señalar que todos los días se carga el archivo TXT a la misma Tabla. Los 20 artículos son constantes, lo que puede variar es el número de vendedores.

    Lo que tengo que hacer es que la información se cargue en la BD en una Tabla con la siguiente estructura:

    Fecha Vendedor Articulo 1 Articulo 22 Articulo 333
    25-ene-10 A. Sánchez 6015.99 2666.25 3456.74
    25-ene-10 B. Blanco 6942.94 6081.12 7603.97
    25-ene-10 D. Soto 5899.69 5066.08 692.09
    25-ene-10 J. Pérez 8546.21 5125.37 3648.45
    25-ene-10 R. Lugo 5803.91 2908.7 1214.07


    Utilizando BULK INSERT, convierto el archivo TXT y lo cargo en una Tabla temporal, pero queda con la estructura inicial.

    Alguien sabe como convertir la Tabla temporal a la estructura necesitada?

    Muchas gracias por el apoyo.

    IGNACIO

    Tuesday, January 26, 2010 6:29 AM

Answers

  • Hola.

    Si estás usando SQL Server 2005/2008, puedes pivotar la tabla, sería más o menos así:

    insert TablaFinal (Fecha, Vendedor, Articulo1, Articulo22, Articulo333)
    select Fecha, Vendedor, Articulo1 = isnull([1], 0), Articulo22 = isnull([22], 0), Articulo333 = isnull([333], 0)
    from (select Fecha, Vendedor, Articulo,	Volumen from TablaIntermedia) T
    pivot (sum(Volumen) for Articulo in ([1], [22], [333])) P

    Esta segunda forma es válida para cualquier versión:

    insert TablaFinal (Fecha, Vendedor, Articulo1, Articulo22, Articulo333)	
    select 
    	Fecha, Vendedor, 
    	Articulo1 = isnull(sum(case when Articulo = 1 then Volumen else 0 end), 0),
    	Articulo22 = isnull(sum(case when Articulo = 22 then Volumen else 0 end), 0),
    	Articulo333 = isnull(sum(case when Articulo = 333 then Volumen else 0 end), 0)
    From TablaIntermedia
    group by Fecha, Vendedor

    Si no te vale, nos dices.


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    Tuesday, January 26, 2010 10:35 AM
    Moderator

All replies

  • Creo recordar que con bulkinsert pudes insertar los datos en una tabla existente en tu BD...

    Si no es asi, podriar hacer un DTS con 2 tareas, leer el fichero y llenar tu tabla temporal, y posteriormente hacer un select into desde la tabla temporal a tu tabla definitiva...

    Si la respuesta te ha sido util Marcala como Respuesta o Votala.
    Mi Blog: Jtorrecilla
    Tuesday, January 26, 2010 7:39 AM
  • Hola.

    Yo realizaría esa tarea con un paquete de Integration Services. Te paso un link sobre cómo importar un fichero a una tabla:


    En tu caso, no debes volcar directamente el resultado a la tabla, sino que debes realizar la agrupación (con una transformación Aggregate) y luego ya sí insertar en la tabla final.

    Realizar la carga primero a una tabla intermedia y luego de ahí a otra definitiva, si bien se puede hacer, tampoco sería necesario si lo haces por esta otra vía.

    Si no lo consigues, nos dices.


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    Tuesday, January 26, 2010 8:28 AM
    Moderator
  • Hola Alberto y Jtorrecilla,

    Agradezco su apoyo.


    Sin embargo, ya tengo importado el archivo TXT en la Tabla inicial en SQL, con la misma estructura del archivo inicial.

    Mi duda es, ¿como hago esa Agrupación o el Select Into para que la Tabla Final quede con la estructura buscada.

    En realidad lo que necesito es hacer algo así como Transponer una matriz, para que los datos de la columna "Volumen" ahora se muestren como renglones de acuerdo con cada "Articulo"


    Gracias de nuevo por la ayuda.

    IGNACIO
    Tuesday, January 26, 2010 9:33 AM
  • Hola.

    Si estás usando SQL Server 2005/2008, puedes pivotar la tabla, sería más o menos así:

    insert TablaFinal (Fecha, Vendedor, Articulo1, Articulo22, Articulo333)
    select Fecha, Vendedor, Articulo1 = isnull([1], 0), Articulo22 = isnull([22], 0), Articulo333 = isnull([333], 0)
    from (select Fecha, Vendedor, Articulo,	Volumen from TablaIntermedia) T
    pivot (sum(Volumen) for Articulo in ([1], [22], [333])) P

    Esta segunda forma es válida para cualquier versión:

    insert TablaFinal (Fecha, Vendedor, Articulo1, Articulo22, Articulo333)	
    select 
    	Fecha, Vendedor, 
    	Articulo1 = isnull(sum(case when Articulo = 1 then Volumen else 0 end), 0),
    	Articulo22 = isnull(sum(case when Articulo = 22 then Volumen else 0 end), 0),
    	Articulo333 = isnull(sum(case when Articulo = 333 then Volumen else 0 end), 0)
    From TablaIntermedia
    group by Fecha, Vendedor

    Si no te vale, nos dices.


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    Tuesday, January 26, 2010 10:35 AM
    Moderator
  • Hola Alberto,

    Funcionó a la perfección!!!

    Como siempre, muchas gracias por la ayuda.

    IGNACIO

    Tuesday, January 26, 2010 4:51 PM