Selecionar Coluna Dinamicamente
22/02/2013
0
Eis que "resurse" eu mais uma vez para pedir a ajuda de vcs... rsrsr
Deixa eu explicar o senário para ver se conseguem me ajudar, eu tenho uma tabela de fechamentos onde eh gravado o abc dos meus produtos, nesta tabela tem 12 colunas para os meses, mes1, mes2, mes3, e assim sucessivamente.
Eu preciso montar um script que me traga apenas a coluna referente ao fechamento do mês imediatamente anterior ao mês atual, ou seja, estamos em fevereiro, eu preciso pegar o abc do fechamento do mês1.
Eis que agora surge a pergunta: Como Fazer isto dinamicamente?
Espero que eu tenha sido claro e que possam me ajudar.
Desde já muito obrigado.
Abraco.
Alex - Lekao
Alex Lekao
Posts
22/02/2013
Cesar Roniglei
Não consegui entender ao certo o que deseja, mas me adiciona ai no seu msn que posso te dar um help.
cesaronig@hotmail.com
28/02/2013
Joel Rodrigues
exec sp_executesql N'SELECT * FROM TbCLIENTES'
Boa sorte.
28/02/2013
Alex Lekao
meu camarada, me desculpe mas não entendi muito bem como poderei utilizar a sp.
eu preciso que as colunas sejam selecionadas dinamicamente de acordo com o mês atual.
Com essa sp eh possível fazer isso?
desculpe as perguntas mas eh que eu não tenho experiência com a manipulação das sps do sql.
obrigado pela ajuda.
Abraco.
Alex - Lekao
28/02/2013
Joel Rodrigues
exec sp_executesql N'SELECT MES1 FROM TABELA'
Ao executar esse comando, seria retornado o resultado do select.
Mas pera aí, você quer fazer isso a partir de uma aplicação? Em que linguagem?
28/02/2013
Alex Lekao
Neste caso eu tenho 12 colunas que correspondem a meses, o que gostaria era para quando o usuário chamar os scripts ele ira ver o saldo referente ao mês imediatamente anterio ao atual, gostaria que isso fosse feito de maneira dinâmica.
Fiz para "quebrar um galho" com o Case, coloquei um case pegando a data e subtraindo 31 e tirando o ano que achei o mês anterior.
mas gostaria de fazer algo mais dinâmico que isso ou mais altomatizado.
Obrigado mais uma vez.
Abraco.
Alex - Lekao
28/02/2013
Joel Rodrigues
[url]http://www.delphibasics.co.uk/RTL.asp?Name=DecodeDate[/url]
28/02/2013
Alex Lekao
não... eu acho que me expressei mal.
eu não estou desenvolvendo, os dados de dados que preciso são no próprio SQL mesmo.
o que eu gostaria era conseguir no lugar de ter que ficar escolhendo a coluna que sera mostrada, essa escolha ser feita de maneira dinâmica baseado no mês atual.
Abraco.
Alex - Lekao
28/02/2013
Joel Rodrigues
Então você pode usar a função DATEPART para obter só o mês da data atual. A partir daí, monta a instrução SQL.
28/02/2013
Alex Lekao
vou colar o código que fiz para ficar mais fácil o entendimento, ai acho que vai ficar melhor para exemplificar.
Eu não quero colocar o case para selecionar as colunas, quero fazer isso dinamicamente.
Segue abaixo o código.
Abraco.
Alex - Lekao
SELECT
E.CODSTK+' - Núm. Fábrica: '+E.CODFAB AS ITEM,
E.CODSTK,
E.CODFAB,
SUBSTRING(E.NOME,1,30) AS NOME,
SUBSTRING(E.MARCA,1,20) AS MARCA,
SUBSTRING(E.FICTEC,1,30) AS APLIC,
(CASE
WHEN DATEPART(M,GETDATE()-31) = '1' THEN F.CLABCQ1
WHEN DATEPART(M,GETDATE()-31) = '2' THEN F.CLABCQ2
WHEN DATEPART(M,GETDATE()-31) = '3' THEN F.CLABCQ3
WHEN DATEPART(M,GETDATE()-31) = '4' THEN F.CLABCQ4
WHEN DATEPART(M,GETDATE()-31) = '5' THEN F.CLABCQ5
WHEN DATEPART(M,GETDATE()-31) = '6' THEN F.CLABCQ6
WHEN DATEPART(M,GETDATE()-31) = '7' THEN F.CLABCQ7
WHEN DATEPART(M,GETDATE()-31) = '8' THEN F.CLABCQ8
WHEN DATEPART(M,GETDATE()-31) = '9' THEN F.CLABCQ9
WHEN DATEPART(M,GETDATE()-31) = '10' THEN F.CLABCQ10
WHEN DATEPART(M,GETDATE()-31) = '11' THEN F.CLABCQ11
WHEN DATEPART(M,GETDATE()-31) = '12' THEN F.CLABCQ12
END) AS ABCQ,
E.CONSUMO,
E.ESTOQUE AS EST,
E.ESTMIN AS MIN,
E.ESTMAX AS MAX,
E.PRCCUE AS CUSTO,
E.ESTOQUE*E.PRCCUE AS TOTCUS,
E.ESTOQUE-E.ESTMAX AS EXCES,
(E.ESTOQUE-E.ESTMAX)*E.PRCCUE AS TOTCUSEXCES
FROM ESTOQUE AS E
LEFT JOIN CLASSABC AS F ON F.CODSTK = E.CODSTK AND F.MESANO = CONVERT(VARCHAR(02),GETDATE()-31,101)+'/'+SUBSTRING(CONVERT(VARCHAR,GETDATE()-31,103),9,2)
WHERE 1 = 1
AND E.ESTOQUE > E.ESTMAX
AND CASE WHEN DATEPART(M,GETDATE()-31) = '1' THEN F.CLABCQ1 WHEN DATEPART(M,GETDATE()-31) = '2' THEN F.CLABCQ2 WHEN DATEPART(M,GETDATE()-31) = '3' THEN F.CLABCQ3 WHEN DATEPART(M,GETDATE()-31) = '4' THEN F.CLABCQ4 WHEN DATEPART(M,GETDATE()-31) = '5' THEN F.CLABCQ5 WHEN DATEPART(M,GETDATE()-31) = '6' THEN F.CLABCQ6 WHEN DATEPART(M,GETDATE()-31) = '7' THEN F.CLABCQ7 WHEN DATEPART(M,GETDATE()-31) = '8' THEN F.CLABCQ8 WHEN DATEPART(M,GETDATE()-31) = '9' THEN F.CLABCQ9 WHEN DATEPART(M,GETDATE()-31) = '10' THEN F.CLABCQ10 WHEN DATEPART(M,GETDATE()-31) = '11' THEN F.CLABCQ11 WHEN DATEPART(M,GETDATE()-31) = '12' THEN F.CLABCQ12 END >= 'A'
AND CASE WHEN DATEPART(M,GETDATE()-31) = '1' THEN F.CLABCQ1 WHEN DATEPART(M,GETDATE()-31) = '2' THEN F.CLABCQ2 WHEN DATEPART(M,GETDATE()-31) = '3' THEN F.CLABCQ3 WHEN DATEPART(M,GETDATE()-31) = '4' THEN F.CLABCQ4 WHEN DATEPART(M,GETDATE()-31) = '5' THEN F.CLABCQ5 WHEN DATEPART(M,GETDATE()-31) = '6' THEN F.CLABCQ6 WHEN DATEPART(M,GETDATE()-31) = '7' THEN F.CLABCQ7 WHEN DATEPART(M,GETDATE()-31) = '8' THEN F.CLABCQ8 WHEN DATEPART(M,GETDATE()-31) = '9' THEN F.CLABCQ9 WHEN DATEPART(M,GETDATE()-31) = '10' THEN F.CLABCQ10 WHEN DATEPART(M,GETDATE()-31) = '11' THEN F.CLABCQ11 WHEN DATEPART(M,GETDATE()-31) = '12' THEN F.CLABCQ12 END <= 'C'
28/02/2013
Joel Rodrigues
28/02/2013
Alex Lekao
eu havia tentado algo pare e não consegui...
mas eu vou tentar novamente seguindo com mais atenção e cautela referente a sua dica e vou ver o que consigo.
Obrigado.
Alex - Lekao
28/02/2013
Joel Rodrigues
28/02/2013
Joel Rodrigues
A tabela tbTESTE tem as colunas mes1, mes2, mes3, mes4, etc.
declare @script nvarchar(max) = '', @coluna varchar(4) = 'mes', @mes int select @mes = datepart(M, getdate()) - 1 set @coluna = @coluna + cast(@mes as varchar) set @script = N'select ' + @coluna + ' from tbTESTE' execute sp_executesql @script
Aí eu pego o mÊs atual, subtraio 1 e monto o nome da coluna que eu quero (mes1, nesse caso, pois fevereiro é o mês 2).
Então eu monto o script e executo usando aquele procedure.
Vê aí se dá pra sacar.
Abraço.
01/03/2013
Alex Lekao
Obrigado.
Abraco.
Alex - Lekao
Clique aqui para fazer login e interagir na Comunidade :)