none
SEPARAR CONTENIDO DE UN CAMPO RRS feed

  • Pregunta

  • Hola,

    Tengo una tabla con la que necesito trabajar para un reporte. El dato mas importante se encuentra en un campo llamado componente. La tabla seria algo asi:

    NUM. ORDEN | COMPONENTE| COSTO

    145      | COMP1 | $130.00

    145 | COMP2 | $40.00

    145      | COMP3 | $70.00

    145 | COMP1 | $98.00

    146      | COMP1 | $98.00

    Necesito sacar un reporte a traves de una consulta sql que me devuelva el siguiente resultado:

    NUM. ORDEN |COMP1 |COMP2 |COMP3 |

    145          |$130+$98.00 |$40 |$70.00 |

    Alguna idea?


    • Editado A. Salazar lunes, 20 de julio de 2015 16:55
    lunes, 20 de julio de 2015 16:45

Respuestas

  • si te refieres a hacer un reporte con reporting services, con este query

    declare @pedidos table (numorden int, componente varchar(100),costo money)
    insert into @pedidos values(145,'comp1',130),(145,'comp2',40),(145,'comp3',70),(145,'comp1',98),(146,'comp1',98)
    select numorden,componente,sum(costo) as costototal from @pedidos group by numorden,componente order by 1,2

    luego eliges un mattrix, metes numorden en filas y componente en columnas mas costo en valores y lo tiens

    Si quieres hacer la matriz por tsql dínoslo y lo hacemos

    o mejor.. comprueba este otro

    create table Pedidos(numorden int, componente varchar(100),costo money)
    insert into pedidos values(145,'comp1',130),(145,'comp2',40),(145,'comp3',70),(145,'comp1',98),(146,'comp1',98)
    
    declare @columnas nvarchar(max)
    select @columnas=stuff((select  distinct ',' +componente from Pedidos for xml path('')),1,1,'')
    declare @sqlstring nvarchar(max)
    set @sqlstring=N'select * from (select numorden,componente,costo from Pedidos) as t pivot (sum(costo) for componente in ('+@columnas+') ) as pivotable';
    exec sp_executesql @sqlstring


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA


    lunes, 20 de julio de 2015 16:54
    Moderador

Todas las respuestas

  • ¿Siempre hay un máximo de 3 componentes?

    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    lunes, 20 de julio de 2015 16:49
  • si te refieres a hacer un reporte con reporting services, con este query

    declare @pedidos table (numorden int, componente varchar(100),costo money)
    insert into @pedidos values(145,'comp1',130),(145,'comp2',40),(145,'comp3',70),(145,'comp1',98),(146,'comp1',98)
    select numorden,componente,sum(costo) as costototal from @pedidos group by numorden,componente order by 1,2

    luego eliges un mattrix, metes numorden en filas y componente en columnas mas costo en valores y lo tiens

    Si quieres hacer la matriz por tsql dínoslo y lo hacemos

    o mejor.. comprueba este otro

    create table Pedidos(numorden int, componente varchar(100),costo money)
    insert into pedidos values(145,'comp1',130),(145,'comp2',40),(145,'comp3',70),(145,'comp1',98),(146,'comp1',98)
    
    declare @columnas nvarchar(max)
    select @columnas=stuff((select  distinct ',' +componente from Pedidos for xml path('')),1,1,'')
    declare @sqlstring nvarchar(max)
    set @sqlstring=N'select * from (select numorden,componente,costo from Pedidos) as t pivot (sum(costo) for componente in ('+@columnas+') ) as pivotable';
    exec sp_executesql @sqlstring


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA


    lunes, 20 de julio de 2015 16:54
    Moderador
  • No soy siempre 3, eso lo puse a modo de ejemplo. En el campo componentes vienen revueltos 6 tipos de componentes: A,B,C,D,E,F. Me interesa dividirlos por Componentes 1, Componentes 2/3/4, Componentes 5 y Componentes 6.
    lunes, 20 de julio de 2015 17:06
  • Asi es la tabla que quiero ejemplificar,. Lo siento Miguel, no uso Reporting Services. De hechoe sta consulta debo pasarla para ejecutarse en Excel. Por eso necesito una consulta de SQL
    lunes, 20 de julio de 2015 17:08
  • Te puse los dos ejemplos usando y sin usar reporting ¿no te valen?

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    lunes, 20 de julio de 2015 17:10
    Moderador
  • ME FUNCIONA ESTA:

    declare @columnas nvarchar(max)
    select @columnas=stuff((select  distinct ',' + D3_COD from SD3010 for xml path('')),1,1,'')


    Pero otra pregunta, ahi donde puedo poner una condicion LIKE?

    Por mis componentes tipo 1 son los que empiezas M01, mis componentes tipo 2, son los que empiezan con MO2, M10 o M11, y mis componentes tipo 3 empienzan con MOD201.

    Muchas Gracias

    lunes, 20 de julio de 2015 17:17
  • select @columnas=stuff((select  distinct ',' + D3_COD from SD3010 where d3_cod like 'xxxxxxx' for xml path('')),1,1,'')

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    lunes, 20 de julio de 2015 17:20
    Moderador
  • GRACIAS MIGUEL, EXCELENTE!
    lunes, 20 de julio de 2015 20:32
  • Hola MIGUEL, UNA PREGUNTA. Mi reporte esta en avance ya. Pero me marca error porque mi consukta arroja mas que un registro, y obvio es asi, porque mi roporte sera mensual, se introducira una fecha de inicio y una de terminacion.

    Alguna sugerencia para poder trabajar con muchos registros?

    /*@orden*/
    /*declare @orden nvarchar(6)
    set @orden = (SELECT C2_NUM FROM SC2010 WHERE C2_NUM=?)*/
    
    
    declare @emissao1 nvarchar(12)
    set @emissao1 = (SELECT D3_EMISSAO FROM SD3010 WHERE D3_EMISSAO>=?)
    declare @emissao2 nvarchar(12)
    set @emissao2 = (SELECT D3_EMISSAO FROM SD3010 WHERE D3_EMISSAO<=?)
    
    /*m01*/
    declare @m01 nvarchar(max)
    select @m01=stuff((select  distinct ',' +D3_COD from SD3010 WHERE D3_COD LIKE 'M01%'/* AND SUBSTRING(D3_OP,1,6)=@orden*/ for xml path('')),1,1,'');
    /*m200*/
    declare @m200 nvarchar(max)
    select @m200=stuff((select  distinct ',' +D3_COD from SD3010 WHERE /*SUBSTRING(D3_OP,1,6)=@orden AND */D3_COD LIKE 'MOD200%' for xml path('')),1,1,'');
    /*m201*/
    declare @m201 nvarchar(max)
    select @m201=stuff((select  distinct ',' +D3_COD from SD3010 WHERE /*SUBSTRING(D3_OP,1,6)=@orden AND*/ D3_COD LIKE 'MOD201%' for xml path('')),1,1,'');
    
    /*m202*/
    declare @m202 nvarchar(max)
    select @m202=stuff((select  distinct ',' +D3_COD from SD3010 WHERE /*SUBSTRING(D3_OP,1,6)=@orden AND */(D3_COD NOT LIKE 'MOD201%' OR D3_COD NOT LIKE 'MOD200%' OR D3_COD NOT LIKE 'M02%' OR D3_COD NOT LIKE 'M10%' OR D3_COD NOT LIKE 'M11%' OR D3_COD NOT LIKE 'M01%' OR D3_COD NOT LIKE 'PT%') for xml path('')),1,1,'');
    
    
    /*pt*/
    declare @pt nvarchar(max)
    select @pt=stuff((select  distinct ',' +D3_COD from SD3010 WHERE /*SUBSTRING(D3_OP,1,6)=@orden AND */D3_COD LIKE 'PT%' for xml path('')),1,1,'');
    /*m02, m10,m11*/
    declare @mvar nvarchar(max)
    select @mvar=stuff((select  distinct ',' +D3_COD from SD3010 WHERE /*SUBSTRING(D3_OP,1,6)=@orden AND */(D3_COD LIKE 'M02%' OR D3_COD LIKE 'M10%' OR D3_COD LIKE 'M11%') for xml path('')),1,1,'');
    
    /* consulta columnas dinamicas pivot*/
    declare @sqlstring nvarchar(max)
    set @sqlstring=N'SELECT * FROM (SELECT SUBSTRING(D3_OP,1,6) AS ORDEN, C2_PRODUTO AS PRODUCTO, D3_COD AS COMPONENTE, SUM(D3_CUSTO1) AS COSTO FROM SD3010, SC2010 WHERE C2_NUM = SUBSTRING(D3_OP,1,6)'+/* AND C2_NUM ='+@orden+' */+' AND D3_EMISSAO>='+@emissao1+' AND D3_EMISSAO<='+@emissao2+'
    GROUP BY D3_OP, C2_PRODUTO, D3_COD) as t pivot (SUM(COSTO) for COMPONENTE IN (['+@pt+'],['+@m01+'],['+@m200+'],['+@m201+'],['+@mvar+'])) as pivotable';
    exec sp_executesql @sqlstring


    martes, 21 de julio de 2015 21:07