none
Consuta en Transac Sql server 2012 RRS feed

  • Pregunta

  • Buenos días estimados, necesito hacer una consulta a mi servidor de Sql server, necesito que me muestre el consumo mensual de los productos, pero el resultado lo necesito con el siguiente formato:

    Como condición, necesito que la consulta tome encuenta lo sigiuente:

    1) Año Actual.

    2) Del primer mes del año, Hasta el mes actual.

    3) La consulta debe mostrar tambien los productos que no han tenido salida alguna.

    Las tablas implicadas en esta consulta son las siguientes:

    Si alguien me puede ayudar, se lo agradesería.

    Gracias.

    viernes, 15 de noviembre de 2019 16:56

Respuestas

  • ¿Qué columna de fecha se debe utilizar: "fecha_solicitada" o "fecha_contabilizada"?

    ¿Debe filtrarse la tabla de ventas por el contenido de la columna "cancelado"?

    ---

    Si lo que necesita es una consulta con PIVOT estático, aquí tiene una sugerencia:

    -- código #1 v3
    declare @Hoy date;
    set @Hoy= cast (current_timestamp as date);
    
    declare @Fecha_inicial date, @Fecha_final date;
    set @Fecha_inicial= datefromparts (year (@Hoy), 1, 1);
    set @Fecha_final= dateadd (day, +1, eomonth (@Hoy));
    
    with 
    aggVenta as (
    SELECT idproducto, month (fecha_contabilizada) as mes, 
           sum (cantidad) as cantidad_mes
      from dbo.DetalleVenta
      where fecha_contabilizada >= @Fecha_inicial 
            and fecha_contabilizada < @Fecha_final
      group by idproducto, month (fecha_contabilizada)
    ),
    Prod_Mes as (
    SELECT P.idproducto, P.producto, M.mes, coalesce (aV.cantidad_mes, 0) as cantidad_mes
      from Productos as P 
           cross apply (values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11)) as M (mes)
           left join aggVenta as aV on aV.idproducto = P.idproducto
                                       and aV.mes = M.mes
    )  
    SELECT idproducto, producto, 
           [1] as [ene-19], [2] as [feb-19], [3] as [mar-19], [4] as [abr-19],
           [5] as [may-19], [6] as [jun-19], [7] as [jul-19], [8] as [ago-19],
           [9] as [sep-19], [10] as [oct-19], [11] as [nov-19],
           ([1] + [2] + [3] + [4] + [5] + [6] + [7] + [8] + [9] + [10] + [11]) as Total_Consumo
      from Prod_Mes
           pivot (max (cantidad_mes) for mes in ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11])) as P


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz viernes, 15 de noviembre de 2019 18:40
    • Marcado como respuesta Reynaldo Sanchez viernes, 15 de noviembre de 2019 18:48
    viernes, 15 de noviembre de 2019 17:34

Todas las respuestas

  • ¿Qué columna de fecha se debe utilizar: "fecha_solicitada" o "fecha_contabilizada"?

    ¿Debe filtrarse la tabla de ventas por el contenido de la columna "cancelado"?

    ---

    Si lo que necesita es una consulta con PIVOT estático, aquí tiene una sugerencia:

    -- código #1 v3
    declare @Hoy date;
    set @Hoy= cast (current_timestamp as date);
    
    declare @Fecha_inicial date, @Fecha_final date;
    set @Fecha_inicial= datefromparts (year (@Hoy), 1, 1);
    set @Fecha_final= dateadd (day, +1, eomonth (@Hoy));
    
    with 
    aggVenta as (
    SELECT idproducto, month (fecha_contabilizada) as mes, 
           sum (cantidad) as cantidad_mes
      from dbo.DetalleVenta
      where fecha_contabilizada >= @Fecha_inicial 
            and fecha_contabilizada < @Fecha_final
      group by idproducto, month (fecha_contabilizada)
    ),
    Prod_Mes as (
    SELECT P.idproducto, P.producto, M.mes, coalesce (aV.cantidad_mes, 0) as cantidad_mes
      from Productos as P 
           cross apply (values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11)) as M (mes)
           left join aggVenta as aV on aV.idproducto = P.idproducto
                                       and aV.mes = M.mes
    )  
    SELECT idproducto, producto, 
           [1] as [ene-19], [2] as [feb-19], [3] as [mar-19], [4] as [abr-19],
           [5] as [may-19], [6] as [jun-19], [7] as [jul-19], [8] as [ago-19],
           [9] as [sep-19], [10] as [oct-19], [11] as [nov-19],
           ([1] + [2] + [3] + [4] + [5] + [6] + [7] + [8] + [9] + [10] + [11]) as Total_Consumo
      from Prod_Mes
           pivot (max (cantidad_mes) for mes in ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11])) as P


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz viernes, 15 de noviembre de 2019 18:40
    • Marcado como respuesta Reynaldo Sanchez viernes, 15 de noviembre de 2019 18:48
    viernes, 15 de noviembre de 2019 17:34
  • En el artículo "Alas & Pivôs" se describen las técnicas de pivote, paso a paso.

    Pero si lo que necesitas es una consulta con PIVOT con SQL dinámico, aquí tienes otra sugerencia:

    -- código #2 v3
    declare @Hoy date;
    set @Hoy= cast (current_timestamp as date);
    
    declare @Fecha_inicial date, @Fecha_final date;
    set @Fecha_inicial= datefromparts (year (@Hoy), 1, 1);
    set @Fecha_final= dateadd (day, +1, eomonth (@Hoy));
    
    with 
    aggVenta as (
    SELECT idproducto, month (fecha_contabilizada) as mes, 
           sum (cantidad) as cantidad_mes
      from dbo.DetalleVenta
      where fecha_contabilizada >= @Fecha_inicial 
            and fecha_contabilizada < @Fecha_final
      group by idproducto, month (fecha_contabilizada)
    )
    SELECT P.idproducto, P.producto, M.mes, coalesce (aV.cantidad_mes, 0) as cantidad_mes
      into #Prod_Mes
      from Productos as P 
           cross apply (values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)) as M (mes)
           left join aggVenta as aV on aV.idproducto = P.idproducto
                                       and aV.mes = M.mes
      where M.mes <= month (@Hoy);
    
    --
    declare @ComandoSQL nvarchar(2000);  
    set @ComandoSQL= N'SELECT idproducto, producto, ';
    
    set language spanish;
    declare @I tinyint, @Col1 nvarchar(200), @Col2 nvarchar(200), @Col3 nvarchar(200);
    
    set @Col1= ''; set @Col2= ''; set @Col3= '';
    set @I= 1;
    
    while @I <= month (@Hoy)
      begin
      set @Col1+= N'[' + cast (@I as nvarchar(2)) + N'] as ['
                        + left (datename (month, datefromparts (year (@Hoy), @I, 1)), 3)
                        + N'-' + cast ((year (@Hoy) % 100) as nchar(2)) + N'], ';
      set @Col2+= N'[' + cast (@I as nvarchar(2)) + N'] + ';
      set @Col3+= N'[' + cast (@I as nvarchar(2)) + N'], ';
      set @I+= 1;
      end;
    
    set @ComandoSQL+= left (@Col1, len (@Col1) -1) + N', ('
                      + left (@Col2, len (@Col2) -2) + N') as Total_Consumo '
                      + N'from #Prod_Mes pivot (max (cantidad_mes) for mes in ('
                      + left (@Col3, len (@Col3) -1) + N')) as P;';
                      
    PRINT @ComandoSQL;
    --EXECUTE (@ComandoSQL);




    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    viernes, 15 de noviembre de 2019 18:00
  • ¿Qué columna de fecha se debe utilizar: "fecha_solicitada" o "fecha_contabilizada"?
    Repuesta: Columna "fecha_contabilizada"
    ¿Debe filtrarse la tabla de ventas por el contenido de la columna "cancelado"?

    Repuesta: "No"

    viernes, 15 de noviembre de 2019 18:38
  • Ya he cambiado los códigos #1 y #2 para usar la columna Fecha_contabilizada. Cuando sea posible, pruébelos de nuevo....


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    viernes, 15 de noviembre de 2019 18:43
  • Gracias por tu repuesta, me ha funcionado aunque vere si se puede modificar, para tomar como parametro,

    @fecha_inicial= min(fecha_contabilizado)

    y

    @fecha_final= max(fecha_contabilizado)

    asi ver, si podemos adaptarla segun los datos grab ados en la tabla.

    viernes, 15 de noviembre de 2019 19:02
  • Gracias, por tus repuesta, pero ahora que lo veo de otro angulo me doy cuenta de que seria mejor modificar esta consulta, de modo, que podamos pasarles los parametros  @fecha_inicial y @fecha_fina,puesto que al final crearía un procedimiento almacenado para mostrarlo en un reporte de crystal reports, asi podamos darle la opcion a nuestro cliente final, la opcion de ver sus movimientos en base a una fecha de inicio y fecha fin.

    Me ayudas....


    viernes, 15 de noviembre de 2019 19:16
  • Gracias, por tus repuesta, pero ahora que lo veo de otro angulo me doy cuenta de que seria mejor modificar esta consulta, de modo, que podamos pasarles los parametros  @fecha_inicial y @fecha_final

    En este caso es necesario modificar el código #2.

     


      Download SQL Server 2019  💾


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz domingo, 17 de noviembre de 2019 11:55
    domingo, 17 de noviembre de 2019 10:09