none
SELECT TABELA COM COLUNAS RRS feed

  • Pergunta

  • Tenho uma tabela com a seguinte estrutura:

    DATA TRANS   CODIGO    SD NA DATA - SD JAN - SD FEV - SD MAR - SD ABR - .......  SD DEZ

    05-01-2014     mem001          100             100       0            0             0                       0

    04-01-2014     mem001          80                 80       0            0             0                       0

    .

    .

    .

    30-12-2013     mem001             80               10      30         20            60                      80

    Necessito de sql para mostrar o SD NA DATA e SD dos últimos 3 Meses (SD DEZ - SD NOV SD OUT).

    Passo a seleção via parâmetro data (today) e, desta forma, o código tem que apresentar as colunas corretas.

    Se estou executando com a data de Janeiro do ano atual, as outras colunas são do ano anterior. Como posso resolver este problema se no meu select trago sempre o ano corrente?

    Grato

    Newton Costa

    segunda-feira, 7 de julho de 2014 17:56

Respostas

  • Newton,

    Existe alguma coluna que armazene somente o número do Mês e Ano?

    Outra ponte o seu Select esta fazendo um Where com o operador >= DataSaldo, então neste caso a primeira parte esta sendo atendida, vejo que um Segundo Select, sendo ele, um Select com base na variável @DataSaldo, só que trazendo no Where os valores dos últimos 60 dias.

    Você conseguiu entender?

    Talvez usar Select para trazer o período atual com o Union All para o outro Select com os valores dos últimos 60 dias.

    Ou então, fazer isso também em duas CTEs.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quarta-feira, 16 de julho de 2014 15:48
  • Ja usou Subquery ?

    Da pra você criar uma consulta dentro de uma coluna especifica. Segue:

    SELECT [dt-saldo] ,[it-codigo] ,[qt-saldo] ,[acum-sai-mes] ,[qt-tra] ,[codigo-refer] ,[desc-item] ,[ano] /*Subquery pro mês 1*/ ,SELECT [qt-saldo] FROM [dbo].[VendasItem] AS [Vend_Item2] WHERE [VendasItem].[it-codigo] = [Vend_Item2].[it-codigo] and [dt-saldo] BETWEEN CONVERT(VARCHAR(12), DATEADD(MONTH, - 1, GETDATE() - (DAY(GETDATE()) - 1)), 112) AND CONVERT(VARCHAR(12), DATEADD(MONTH, 0, GETDATE() - DAY(GETDATE())), 112))

    as [qtd mes1], ,[qtd mes2] ,[qtd mes3] FROM [dbo].[VendasItem] where [dt-saldo] >= @datasaldo by [it-codigo], [ano]

    Ai é só fazer o mesmo esquema pro mês 2 e mês 3, só mudar o between e subtrair 1 pra cada mês anterior no dateadd, ex pro mês 2:

    [dt-saldo] BETWEEN CONVERT(VARCHAR(12), DATEADD(MONTH, - 2, GETDATE() - (DAY(GETDATE()) - 1)), 112) AND

    CONVERT(VARCHAR(12), DATEADD(MONTH, -1, GETDATE() - DAY(GETDATE())), 112))

    as [qtd mes2]

    Ex mês 3:

    [dt-saldo] BETWEEN CONVERT(VARCHAR(12), DATEADD(MONTH, - 3, GETDATE() - (DAY(GETDATE()) - 1)), 112) AND

    CONVERT(VARCHAR(12), DATEADD(MONTH, -2, GETDATE() - DAY(GETDATE())), 112))

    as [qtd mes3]

    Só achei estranho esse [] pras colunas, aqui uso sem esse esquema ai, mas tentei ajustar de acordo com sua consulta vê se ta certo,

    abraços!


    quinta-feira, 17 de julho de 2014 21:01

Todas as Respostas

  • Newton,

    Você poderia postar o seu Select?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quarta-feira, 9 de julho de 2014 12:59
  • USE [handy]
    GO

    SELECT [dt-saldo]
          ,[it-codigo]
          ,[qt-saldo]
          ,[acum-sai-mes]
          ,[qt-tra]
          ,[codigo-refer]
          ,[desc-item]
          ,[ano]
          ,[qtd mes1]
          ,[qtd mes2]
          ,[qtd mes3]
                
      FROM [dbo].[VendasItem]
      where [dt-saldo] >= @datasaldo by  [it-codigo], [ano]
    GO


    Desta forma consigo apresentar somente dados referentes ao ano corrente porem, meu relatório precisa apresentar o saldo dos últimos 2 meses, anteriores a data de execução.

    Ex; Se executo o relatório em janeiro, o saldos a serem apresentados são: Janeiro do ano corrente e Dezembro e Novembro do Ano anterior.


    quarta-feira, 9 de julho de 2014 13:24
  • Newton,

    Existe alguma coluna que armazene somente o número do Mês e Ano?

    Outra ponte o seu Select esta fazendo um Where com o operador >= DataSaldo, então neste caso a primeira parte esta sendo atendida, vejo que um Segundo Select, sendo ele, um Select com base na variável @DataSaldo, só que trazendo no Where os valores dos últimos 60 dias.

    Você conseguiu entender?

    Talvez usar Select para trazer o período atual com o Union All para o outro Select com os valores dos últimos 60 dias.

    Ou então, fazer isso também em duas CTEs.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quarta-feira, 16 de julho de 2014 15:48
  • Ja usou Subquery ?

    Da pra você criar uma consulta dentro de uma coluna especifica. Segue:

    SELECT [dt-saldo] ,[it-codigo] ,[qt-saldo] ,[acum-sai-mes] ,[qt-tra] ,[codigo-refer] ,[desc-item] ,[ano] /*Subquery pro mês 1*/ ,SELECT [qt-saldo] FROM [dbo].[VendasItem] AS [Vend_Item2] WHERE [VendasItem].[it-codigo] = [Vend_Item2].[it-codigo] and [dt-saldo] BETWEEN CONVERT(VARCHAR(12), DATEADD(MONTH, - 1, GETDATE() - (DAY(GETDATE()) - 1)), 112) AND CONVERT(VARCHAR(12), DATEADD(MONTH, 0, GETDATE() - DAY(GETDATE())), 112))

    as [qtd mes1], ,[qtd mes2] ,[qtd mes3] FROM [dbo].[VendasItem] where [dt-saldo] >= @datasaldo by [it-codigo], [ano]

    Ai é só fazer o mesmo esquema pro mês 2 e mês 3, só mudar o between e subtrair 1 pra cada mês anterior no dateadd, ex pro mês 2:

    [dt-saldo] BETWEEN CONVERT(VARCHAR(12), DATEADD(MONTH, - 2, GETDATE() - (DAY(GETDATE()) - 1)), 112) AND

    CONVERT(VARCHAR(12), DATEADD(MONTH, -1, GETDATE() - DAY(GETDATE())), 112))

    as [qtd mes2]

    Ex mês 3:

    [dt-saldo] BETWEEN CONVERT(VARCHAR(12), DATEADD(MONTH, - 3, GETDATE() - (DAY(GETDATE()) - 1)), 112) AND

    CONVERT(VARCHAR(12), DATEADD(MONTH, -2, GETDATE() - DAY(GETDATE())), 112))

    as [qtd mes3]

    Só achei estranho esse [] pras colunas, aqui uso sem esse esquema ai, mas tentei ajustar de acordo com sua consulta vê se ta certo,

    abraços!


    quinta-feira, 17 de julho de 2014 21:01
  • Pergunta:

         Que versão do SQL Server você está utilizando?


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    quarta-feira, 23 de julho de 2014 20:18
    Moderador