none
Ayuda consulta con Pivot RRS feed

  • Pregunta

  • Buen dia Sr Leandro, he estado buscando en foros y no puedo encontrar solucion, espero ud pueda ayudarme se lo agradeceria. Tengo esta consulta :

    select * 
    from
    (
    SELECT pro.Descripcion, p.DescripPresentacion as Present, pp.Precio
    from Tab_Productos pro
    inner join Tab_PresentacionProd pp on pp.IdProducto=pro.IdProducto
    inner join Tab_Presentacion p on p.IdPresentacion=pp.IdPresentacion
    WHERE pro.IdProducto=72
    ) as SOURCETAB
    PIVOT
    (MAX([Precio]) FOR [Present] IN
    ([PRECIO A],[PRECIO B],[PRECIO C])) AS PivotTable

    --- MI PROBLEMAS SON:

    - La consulta como sourcetab me envia el resultado de 3 filas el mismo producto en diferentes presentaciones y precios :

    ACEITE C-68      UNIDADES     3.70

    ACEITE C-68      DOCENAS     35.00

    ACEITE C-68      BONIFICA       1.50

    YO NECESITO ESTE TIPO DE RESULTADO :

    PRODUCTO          UNIDADES     DOCENA    BONIFICA

    ACEITE C-68             3,70           35.00            1.50

    APLICO LA FUNCION PIVOT Y ME DA LOS DATOS EN NULL, SE QUE TIENE QUE UTILIZARSE UNA FUNCION DE AGREGADO PERO EN ESTE CASO NO NECESITO HACER NINGUN CALCULO, SOLO QUE ME FIGURE EL PRECIO SEGUN LA PRESENTACION.

    OTRO TEMA ES QUE PASARIA SI MAS ADELANTE AGREGAN OTRA PRESENTACION AL MISMO PRODUCTO, ENTIENDO QUE ESTA CONSULTA NO FUNCIONARIA Y HE LEIDO QUE TENDRIA QUE USAR UN PIVOT DINAMICO.

    PODRIA ORIENTARME Y APOYARME EN RESOLVER MIS DUDAS.

    GRACIAS POR SU TIEMPO.

    ARMANDO


    Armando

    miércoles, 16 de mayo de 2018 19:17

Respuestas

  • Hola, "En realidad debe ser dinamico, ya que los productos pueden tener multiples presentaciones" 

    en ese caso debes explicarte un poco mas , entonces deseas mostrar este reporte por cada proucto de manera separada?, si es asi entonces en ese caso debes mandar un parámetro que lo filtre por id producto digamos

    Esta es una consulta mas de sql, en este caso le estoy poniendo "en hard code" el id de producto 2

    create table #sourcetab
    (
    idProducto          int,
    Descripcion         varchar(100), 
    DescripPresentacion varchar(100), 
    Precio              decimal(10,2)
    )
    insert into #sourcetab values (1,'ACEITE C-68','UNIDADES',3.70)
    insert into #sourcetab values (1,'ACEITE C-68','DOCENAS',35.00)
    insert into #sourcetab values (1,'ACEITE C-68','BONIFICA',1.50)
    insert into #sourcetab values (1,'ACEITE C-68','CAJA',7.50)
    insert into #sourcetab values (2,'ARROZ C-68','DOCENAS',15.00)
    insert into #sourcetab values (2,'ARROZ C-68','BONIFICA',8.50)
    insert into #sourcetab values (2,'ARROZ C-68','CAJA',17.50)
    
    select * from #sourcetab
     
    declare @columns varchar(MAX);
    declare @sql     nvarchar(MAX);
    set @columns = STUFF(
    (
    select
    ',' + QUOTENAME(LTRIM(DescripPresentacion))
    from
    (select distinct DescripPresentacion from #sourcetab
       where idProducto=2
     ) as T
    
    FOR XML PATH('')
    ), 1, 1, '');
     
     --select @columns
     
    set @sql = N'
    select
    * 
    from
    (  
    select   *
    from #sourcetab 
    where idProducto=2
    ) AS T
    PIVOT 
    (
     max(precio) 
    FOR DescripPresentacion  IN (' + @columns + N')
    ) AS P '; 
      
     exec sp_executesql @sql;
     drop table #sourcetab


    Votar es agradecer.
    Saludos.
    Lima-Perú


    • Editado Augusto1982 miércoles, 16 de mayo de 2018 23:43
    • Marcado como respuesta Armando Salas viernes, 18 de mayo de 2018 4:47
    miércoles, 16 de mayo de 2018 23:42

Todas las respuestas

  • Hola, podrías utilizar algo como

    select Descripcion, 
    MAX( CASE WHEN DescripPresentacion='UNIDADES' THEN precio ELSE NULL END ) as 'UNIDADES',
    MAX( CASE WHEN DescripPresentacion='DOCENAS'  THEN precio ELSE NULL END ) as 'DOCENAS',
    MAX( CASE WHEN DescripPresentacion='BONIFICA' THEN precio ELSE NULL END ) as 'BONIFICA'
     from Tab_Productos
     group by Descripcion

    Ahora el tema sería si quieres que sea dinámico 


    Votar es agradecer.
    Saludos.
    Lima-Perú


    • Editado Augusto1982 miércoles, 16 de mayo de 2018 19:29
    miércoles, 16 de mayo de 2018 19:29
  • Gracias por su tiempo.

    En realidad debe ser dinamico, ya que los productos pueden tener multiples presentaciones, en realidad lo restringo solo a 4 por producto justamente para no tener problemas con la consulta.

    Saludos

    Armando


    Armando

    miércoles, 16 de mayo de 2018 20:02
  • Hola, en realidad debería utilizar la función pivot, mas en específico el pivot dinámico,podrías guiarte de

    pivote sql server transponer nombres


    Votar es agradecer.
    Saludos.
    Lima-Perú


    • Editado Augusto1982 miércoles, 16 de mayo de 2018 20:11
    miércoles, 16 de mayo de 2018 20:10
  • Hola, "En realidad debe ser dinamico, ya que los productos pueden tener multiples presentaciones" 

    en ese caso debes explicarte un poco mas , entonces deseas mostrar este reporte por cada proucto de manera separada?, si es asi entonces en ese caso debes mandar un parámetro que lo filtre por id producto digamos

    Esta es una consulta mas de sql, en este caso le estoy poniendo "en hard code" el id de producto 2

    create table #sourcetab
    (
    idProducto          int,
    Descripcion         varchar(100), 
    DescripPresentacion varchar(100), 
    Precio              decimal(10,2)
    )
    insert into #sourcetab values (1,'ACEITE C-68','UNIDADES',3.70)
    insert into #sourcetab values (1,'ACEITE C-68','DOCENAS',35.00)
    insert into #sourcetab values (1,'ACEITE C-68','BONIFICA',1.50)
    insert into #sourcetab values (1,'ACEITE C-68','CAJA',7.50)
    insert into #sourcetab values (2,'ARROZ C-68','DOCENAS',15.00)
    insert into #sourcetab values (2,'ARROZ C-68','BONIFICA',8.50)
    insert into #sourcetab values (2,'ARROZ C-68','CAJA',17.50)
    
    select * from #sourcetab
     
    declare @columns varchar(MAX);
    declare @sql     nvarchar(MAX);
    set @columns = STUFF(
    (
    select
    ',' + QUOTENAME(LTRIM(DescripPresentacion))
    from
    (select distinct DescripPresentacion from #sourcetab
       where idProducto=2
     ) as T
    
    FOR XML PATH('')
    ), 1, 1, '');
     
     --select @columns
     
    set @sql = N'
    select
    * 
    from
    (  
    select   *
    from #sourcetab 
    where idProducto=2
    ) AS T
    PIVOT 
    (
     max(precio) 
    FOR DescripPresentacion  IN (' + @columns + N')
    ) AS P '; 
      
     exec sp_executesql @sql;
     drop table #sourcetab


    Votar es agradecer.
    Saludos.
    Lima-Perú


    • Editado Augusto1982 miércoles, 16 de mayo de 2018 23:43
    • Marcado como respuesta Armando Salas viernes, 18 de mayo de 2018 4:47
    miércoles, 16 de mayo de 2018 23:42
  • Hola, se solucionó tu consulta o necesitas algo mas?


    Votar es agradecer.
    Saludos.
    Lima-Perú

    jueves, 17 de mayo de 2018 18:11
  • Hola que tal, si gracias se soluciono mi problema en la consulta.

    Ahora tengo otro inconveniente, para mostrar en mi reporte .RDLC; no tengo claro cuando lo pongo en un tablix como voy a saber cuantas columnas voy a considerar, si no se cuantas me va venir del procedimiento.

    Saludos

    Armando


    Armando

    viernes, 18 de mayo de 2018 0:28
  • Hola que tal, si gracias se soluciono mi problema en la consulta.

    Ahora tengo otro inconveniente, para mostrar en mi reporte .RDLC; no tengo claro cuando lo pongo en un tablix como voy a saber cuantas columnas voy a considerar, si no se cuantas me va venir del procedimiento.

    Saludos

    Armando


    Armando

    Hola, bueno eso esta un poco mas complicado , no se hasta que punto se pueda hacer , no has considerado hacer un reporte que pueda ser mas dinámico como ser un excel.

    Votar es agradecer.
    Saludos.
    Lima-Perú

    viernes, 18 de mayo de 2018 3:53
  • Estoy pensando que podria enviar directamente la consulta a un excel para que de ahi lo impriman; es lo que se me ocurre por el momento. Que te parece ?

    Saludos

    Armando


    Armando

    viernes, 18 de mayo de 2018 4:48