none
Data de Pesquisa RRS feed

  • Pergunta

  • Bom dia

    Por favor, estou criando uma consulta com objetivo de mostrar a quantidade de itens nos pedidos de venda:

           Janeiro = IsNull(Sum(CONVERT(numeric,case month(t22.DocDueDate)when 01 then T11.QUANTITY end)),0),
           Fevereiro = IsNull(Sum(CONVERT(numeric,case month(t22.DocDueDate)when 02 then T11.QUANTITY end)),0),
           Março = IsNull(Sum(CONVERT(numeric,case month(t22.DocDueDate)when 03 then T11.QUANTITY end)),0),
           Abril = IsNull(Sum(CONVERT(numeric,case month(t22.DocDueDate)when 04 then T11.QUANTITY end)),0),
          Maio = IsNUll(SUM (convert(numeric, CASE MONTH (t22.DocDueDate) when 05 then T11.QUANTITY end) ),0),
          Junho = IsNUll(SUM (convert(numeric, CASE MONTH (t22.DocDueDate) when 06 then T11.QUANTITY end) ),0),
          Julho = IsNUll(SUM (convert(numeric, CASE MONTH (t22.DocDueDate) when 07 then T11.QUANTITY end) ),0),
          Agosto = IsNUll(SUM (convert(numeric, CASE MONTH (t22.DocDueDate) when 08 then T11.QUANTITY end) ),0),
          Setembro = IsNUll(SUM (convert(numeric, CASE MONTH (t22.DocDueDate) when 09 then T11.QUANTITY end) ),0),
          Outubro = IsNUll(SUM (convert(numeric, CASE MONTH (t22.DocDueDate) when 10 then T11.QUANTITY end) ),0),
          Novembro = IsNUll(SUM (convert(numeric, CASE MONTH (t22.DocDueDate) when 11 then T11.QUANTITY end) ),0),
          Dezembro = IsNUll(SUM (convert(numeric, CASE MONTH (t22.DocDueDate) when 12 then T11.QUANTITY end) ),0)

    e traz o resultado assim: 

    Objetivo que traga o resultado a partir no mês atual não retroagir assim:

    Obrigado


    quarta-feira, 8 de março de 2017 13:56

Respostas

  • Bom dia,

    Paranhas, pelo que entendi acho que uma alternativa seria utilizar uma query dinâmica com Pivot. Ex:

    declare @SQL nvarchar(max);
    declare @MesesIn nvarchar(max);
    declare @MesesCol nvarchar(max);
    declare @MesAux integer;
    declare @DataIni date;
    declare @DataAux date;
    
    set @MesesIn = '';
    set @MesesCol = '';
    set @MesAux = Month(current_timestamp);
    set @DataIni = dateadd(month, datediff(month, 0, current_timestamp), 0);
    set @DataAux = @DataIni;
    
    while @MesAux < 13
      begin
        set @MesesIn = @MesesIn + ', [' + cast(@MesAux as nvarchar) + ']'
        set @MesesCol = @MesesCol + ', ' + datename(month, @DataAux) + ' = [' + cast(@MesAux as nvarchar) + ']'
        set @MesAux = @MesAux + 1
        set @DataAux = dateadd(month, 1, @DataAux)
      end
    
    set @SQL = 
        'select ' + 
        stuff(@MesesCol, 1, 2, '') + 
        ' from ( select month(t22.DocDueDate) as Mes, t11.Quantity from Tabela22 as t22 ' +
        'inner join Tabela11 as t11 on t11.DocID = t22.DocID ' +
        'where t22.DocDueDate >= ''' +
        cast(@DataIni as nvarchar) +
        ''' and t22.DocDueDate < ''' +
        cast(@DataAux as nvarchar) +
        ''') as t pivot (sum(Quantity) for Mes in (' +
        stuff(@MesesIn, 1, 2, '') +
        ')) as p';  
        
    execute sp_executesql @SQL

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 8 de março de 2017 14:49
  • Deleted
    quarta-feira, 8 de março de 2017 14:54

Todas as Respostas

  • Usa case antes do mês, você vai precisar criar uma variável para pegar o mês atual 
    quarta-feira, 8 de março de 2017 14:12
  • Minha sugestão não vai funcionar, estou pensando em outra solução.
    quarta-feira, 8 de março de 2017 14:48
  • Bom dia,

    Paranhas, pelo que entendi acho que uma alternativa seria utilizar uma query dinâmica com Pivot. Ex:

    declare @SQL nvarchar(max);
    declare @MesesIn nvarchar(max);
    declare @MesesCol nvarchar(max);
    declare @MesAux integer;
    declare @DataIni date;
    declare @DataAux date;
    
    set @MesesIn = '';
    set @MesesCol = '';
    set @MesAux = Month(current_timestamp);
    set @DataIni = dateadd(month, datediff(month, 0, current_timestamp), 0);
    set @DataAux = @DataIni;
    
    while @MesAux < 13
      begin
        set @MesesIn = @MesesIn + ', [' + cast(@MesAux as nvarchar) + ']'
        set @MesesCol = @MesesCol + ', ' + datename(month, @DataAux) + ' = [' + cast(@MesAux as nvarchar) + ']'
        set @MesAux = @MesAux + 1
        set @DataAux = dateadd(month, 1, @DataAux)
      end
    
    set @SQL = 
        'select ' + 
        stuff(@MesesCol, 1, 2, '') + 
        ' from ( select month(t22.DocDueDate) as Mes, t11.Quantity from Tabela22 as t22 ' +
        'inner join Tabela11 as t11 on t11.DocID = t22.DocID ' +
        'where t22.DocDueDate >= ''' +
        cast(@DataIni as nvarchar) +
        ''' and t22.DocDueDate < ''' +
        cast(@DataAux as nvarchar) +
        ''') as t pivot (sum(Quantity) for Mes in (' +
        stuff(@MesesIn, 1, 2, '') +
        ')) as p';  
        
    execute sp_executesql @SQL

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 8 de março de 2017 14:49
  • Deleted
    quarta-feira, 8 de março de 2017 14:54
  • Bom dia

    desculpe a demora, estava entendendo a logica, deu certo ,muito obrigado

    quinta-feira, 9 de março de 2017 11:42
  • Bom dia

    Muito obrigado gapimex, estava entendendo a logiaca não tinha utilizado ainda query dinâmica com Pivot, vou estudar mais sobre isso.

    abs

    quinta-feira, 9 de março de 2017 11:44