Usuário com melhor resposta
SELECT TABELA COM COLUNAS

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
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]
- Sugerido como Resposta Durval RamosModerator quinta-feira, 31 de julho de 2014 17:40
- Marcado como Resposta Durval RamosModerator terça-feira, 14 de outubro de 2014 11:13
-
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!
- Editado William Crudeli Jr quinta-feira, 17 de julho de 2014 21:02 Mais detalhado
- Sugerido como Resposta Durval RamosModerator quinta-feira, 31 de julho de 2014 17:40
- Marcado como Resposta Durval RamosModerator terça-feira, 14 de outubro de 2014 11:13
Todas as Respostas
-
-
USE [handy]
GOSELECT [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.
- Editado Newton Costa-BA quarta-feira, 9 de julho de 2014 13:27
-
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]
- Sugerido como Resposta Durval RamosModerator quinta-feira, 31 de julho de 2014 17:40
- Marcado como Resposta Durval RamosModerator terça-feira, 14 de outubro de 2014 11:13
-
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!
- Editado William Crudeli Jr quinta-feira, 17 de julho de 2014 21:02 Mais detalhado
- Sugerido como Resposta Durval RamosModerator quinta-feira, 31 de julho de 2014 17:40
- Marcado como Resposta Durval RamosModerator terça-feira, 14 de outubro de 2014 11:13
-