locked
Comparação de indice do retorno select com uma variavel RRS feed

  • Pergunta

  • Boa tarde,

    Em uma consulta é possível comparar um dos índices de um retorno de um Select com uma variável ?

    Por exemplo:

    No Select retorna 3 linhas, e em cada linha contem uma coluna que se chama dia, resumindo, eu preciso utilizar o dia de cada coluna para somar a uma data, isso é possível?

    Obrigado.

    terça-feira, 20 de outubro de 2015 18:35

Respostas

  • Jefferson, dá uma olhada...

    CREATE TABLE #TEMP
    (
       DIA DATETIME
    )
    
    DECLARE @DATA DATETIME
    SET @DATA = '2015-10-10'
    
    
    INSERT INTO #TEMP VALUES('2015-10-17')
    INSERT INTO #TEMP VALUES('2015-10-16')
    INSERT INTO #TEMP VALUES('2015-10-20')
    
    
    
    SELECT 
    	DATEADD(DAY,DAY(DIA),@DATA) --somados os dias do select com a data fixa
    FROM #TEMP
    
    DROP TABLE #TEMP

    • Marcado como Resposta Marcos SJ terça-feira, 27 de outubro de 2015 13:17
    terça-feira, 20 de outubro de 2015 18:56
  • Vc pode usar uma CTE olha esse exemplo do Gustavo Maia

    CTE


    Flávio Farias
    "May the Force be with you"
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"


    terça-feira, 20 de outubro de 2015 21:41
  • Oi Jefferson,

    Onde você citou array, você poderia usar uma tabela temporária para incluir os campos pgto_codigo, os dias e os dias de vencimento já calculados.

    • Marcado como Resposta Marcos SJ terça-feira, 27 de outubro de 2015 13:17
    quinta-feira, 22 de outubro de 2015 23:41

Todas as Respostas

  • Vc pode colocar um exemplo ?

    Essa data que vai ser somada é fixa ou variável ?

    Ela vem por uma outra consulta ?


    Flávio Farias
    "May the Force be with you"
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    terça-feira, 20 de outubro de 2015 18:41
  • Que tipo de dado é essa coluna dia? datetime? int?
    terça-feira, 20 de outubro de 2015 18:45
  • Fiz um exemplo pequeno aqui !!!

    Ele pode ir além, usando case e por ai vai, vai depender da sua necessidade !!!

    CREATE TABLE #tmp
    (
    	id INT IDENTITY (1,1),
    	DATA date
    )
    
    INSERT #tmp (DATA ) VALUES  ('2015-10-20')
    INSERT #tmp (DATA ) VALUES  ('2015-10-20')
    INSERT #tmp (DATA ) VALUES  ('2015-10-20')
    INSERT #tmp (DATA ) VALUES  ('2015-10-20')
    
    SELECT * FROM #tmp
    
    DECLARE @variavel INT
    SET @variavel = 4
    
    /*Quantidade de dias a ser somado*/
    DECLARE @qtdias int
    SET @qtdias = 3
    
    
    SELECT  data ,
            DATEADD(d, 5, data)
    FROM    #tmp
    WHERE   id = @variavel
    
    DROP TABLE #tmp


    Flávio Farias
    "May the Force be with you"
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    terça-feira, 20 de outubro de 2015 18:47
  • Jefferson, dá uma olhada...

    CREATE TABLE #TEMP
    (
       DIA DATETIME
    )
    
    DECLARE @DATA DATETIME
    SET @DATA = '2015-10-10'
    
    
    INSERT INTO #TEMP VALUES('2015-10-17')
    INSERT INTO #TEMP VALUES('2015-10-16')
    INSERT INTO #TEMP VALUES('2015-10-20')
    
    
    
    SELECT 
    	DATEADD(DAY,DAY(DIA),@DATA) --somados os dias do select com a data fixa
    FROM #TEMP
    
    DROP TABLE #TEMP

    • Marcado como Resposta Marcos SJ terça-feira, 27 de outubro de 2015 13:17
    terça-feira, 20 de outubro de 2015 18:56
  • Tenho um select que me retorna a quantidade de registros de acordo com a forma de pagamento:

    >>> select (COUNT(venc_codigo)) from Financeiro.[VencimentosPagamento] where pgto_codigo = 1018 

    Nesse exemplo me retorna 3.

    por outro lado tenho outro select parecido que retorna todos os registros da forma de pagamento em questão:

    >>> select * from Financeiro.VencimentosPagamento where pgto_codigo=1018

    Resultado do select:

    venc_codigo|pgto_codigo|dias

    1 | 20 | 1018 |30
    2 | 21 | 1018 | 60
    3 | 22 | 1018 | 90

    Também tenho um select que retorno em uma variável a data que o usuário cadastrou sendo da conta, assim a data muda de conta para conta e preciso para cada registro retornado na imagem inserir um titulo (parcela) em outra tabela contendo o respectivo valor de sua parcela e o dia de cada vencimento somado a data.

    O resultado do select se refere a quantidade de vencimentos referente a forma de pagamento escolhida no cadastro de contas, ou seja, isso varia de acordo com a forma de pagamento escolhida pelo usuário do sistema.

    segue a procedure desenvolvida até o momento:

     create procedure spGeraTitulos
    @conta int
      as
     begin
      --variaveis
    declare @pgto_codigo int, @valor decimal(18,2), @data date
    declare @vencimentos int = 1,  @pessoa int, @dataalteracao as date
    declare @descricao varchar(100), @valorparcela decimal(18,2)

    --trazer o valor, a forma de pagamento e a data da nota
    SELECT @valor=cont_valor,@pgto_codigo=formapgto_codigo,@data=cont_datanota, 
    @pessoa=pes_codigo,@dataalteracao=cont_alteracao, @descricao=cont_descricao
    FROM Financeiro.Contas where cont_codigo = @conta

    declare @qtd int
    --trazer a quantidade de vencimentos
    select @qtd=(COUNT(venc_codigo)) from Financeiro.[VencimentosPagamento] where pgto_codigo = 1018 

    set @valorparcela=@valor/@qtd --divisao do valor cheio em parcelas

    WHILE (@vencimentos <= @qtd) 
    BEGIN

    insert into Financeiro.Titulos 
    (cont_codigo,tit_descricao,tit_valorparcela,tit_datavencimento,tit_data,pes_codigo,sit_codigo,sta_codigo) 
    values(@conta,@descricao+', parcela '+ convert(varchar(20),@vencimentos),@valorparcela,@data,@pessoa,1,1);

    set @vencimentos=@vencimentos+1;
    END
    END

    exec spGeraTitulos 2
    terça-feira, 20 de outubro de 2015 19:02
  • Tenho um select que me retorna a quantidade de registros de acordo com a forma de pagamento:

    >>> select (COUNT(venc_codigo)) from Financeiro.[VencimentosPagamento] where pgto_codigo = 1018 

    Nesse exemplo me retorna 3.

    por outro lado tenho outro select parecido que retorna todos os registros da forma de pagamento em questão:

    >>> select * from Financeiro.VencimentosPagamento where pgto_codigo=1018

    Resultado do select:

    venc_codigo|pgto_codigo|dias

    1 | 20 | 1018 |30
    2 | 21 | 1018 | 60
    3 | 22 | 1018 | 90

    Também tenho um select que retorno em uma variável a data que o usuário cadastrou sendo da conta, assim a data muda de conta para conta e preciso para cada registro retornado na imagem inserir um titulo (parcela) em outra tabela contendo o respectivo valor de sua parcela e o dia de cada vencimento somado a data.

    O resultado do select se refere a quantidade de vencimentos referente a forma de pagamento escolhida no cadastro de contas, ou seja, isso varia de acordo com a forma de pagamento escolhida pelo usuário do sistema.

    segue a procedure desenvolvida até o momento:

     create procedure spGeraTitulos
    @conta int
      as
     begin
      --variaveis
    declare @pgto_codigo int, @valor decimal(18,2), @data date
    declare @vencimentos int = 1,  @pessoa int, @dataalteracao as date
    declare @descricao varchar(100), @valorparcela decimal(18,2)

    --trazer o valor, a forma de pagamento e a data da nota
    SELECT @valor=cont_valor,@pgto_codigo=formapgto_codigo,@data=cont_datanota, 
    @pessoa=pes_codigo,@dataalteracao=cont_alteracao, @descricao=cont_descricao
    FROM Financeiro.Contas where cont_codigo = @conta

    declare @qtd int
    --trazer a quantidade de vencimentos
    select @qtd=(COUNT(venc_codigo)) from Financeiro.[VencimentosPagamento] where pgto_codigo = 1018 

    set @valorparcela=@valor/@qtd --divisao do valor cheio em parcelas

    WHILE (@vencimentos <= @qtd) 
    BEGIN

    insert into Financeiro.Titulos 
    (cont_codigo,tit_descricao,tit_valorparcela,tit_datavencimento,tit_data,pes_codigo,sit_codigo,sta_codigo) 
    values(@conta,@descricao+', parcela '+ convert(varchar(20),@vencimentos),@valorparcela,@data,@pessoa,1,1);

    set @vencimentos=@vencimentos+1;
    END
    END

    exec spGeraTitulos 2

    Blz, e o que vc quer exatamente ?

    Somar a quantidade de dias da consulta: "select * from Financeiro.VencimentosPagamento where pgto_codigo=1018"?


    Flávio Farias
    "May the Force be with you"
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    terça-feira, 20 de outubro de 2015 19:11
  • Não exatamente, 

    Este select me retorna 3 linhas, sendo que cada linha tem que corresponder a um futuro insert na tabela de titulos a receber, sendo que em cada linha retornada existe a coluna "dia" que contem no exemplo com os valores em cada retorno (30 , 60 , 90), para cada dia desse eu somaria individualmente a uma data da conta que cadastrei, e com outros demais valores demais e faria um insert na tabela de titulos.

    terça-feira, 20 de outubro de 2015 19:21
  • Não exatamente, 

    Este select me retorna 3 linhas, sendo que cada linha tem que corresponder a um futuro insert na tabela de titulos a receber, sendo que em cada linha retornada existe a coluna "dia" que contem no exemplo com os valores em cada retorno (30 , 60 , 90), para cada dia desse eu somaria individualmente a uma data da conta que cadastrei, e com outros demais valores demais e faria um insert na tabela de titulos.

    Fiz um exemplo !!!!
    Criei uma temporária para simular sua tabela com os dias, em seguida criei uma outra tabela onde tenho uma data, e atribui a uma variável o valor dessa data, lembrando que vc pode cruzar isso através de um id e etc...

    CREATE TABLE #tmp
    (
    	id INT,
    	venc_codigo INT,
    	pgto_codigo INT,
    	dias int
    )
    
    INSERT #tmp ( id, venc_codigo, pgto_codigo, dias ) VALUES  (1,20,1018,30)
    INSERT #tmp ( id, venc_codigo, pgto_codigo, dias ) VALUES  (2,21,1018,60)
    INSERT #tmp ( id, venc_codigo, pgto_codigo, dias ) VALUES  (3,22,1018,90)
    
    CREATE TABLE #tmp2
    (
    	DATA date
    )
    
    INSERT #tmp2 ( DATA ) VALUES  ('01/01/2015')
    
    DECLARE @data DATE
    SELECT @data = data FROM #tmp2
    
    SELECT id,venc_codigo,pgto_codigo,dias,@data AS data_original,DATEADD(DAY,dias,@data) as data_alterada FROM #tmp

    Copia e executa e veja o resultado


    Flávio Farias
    "May the Force be with you"
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    terça-feira, 20 de outubro de 2015 19:39
  • O resultado em partes seria mais ou menos isso, porém a minha dificuldade é que eu tenho esse resultado que voce me passou em um select e a coluna dia que eu preciso pra manipular as datas e salvar em uma outra tabela referenciando de qual conta é.

    talvez uma array pudesse guardar o pgto _codigo e os dias de 3 registros? 

    terça-feira, 20 de outubro de 2015 21:15
  • Vc pode usar uma CTE olha esse exemplo do Gustavo Maia

    CTE


    Flávio Farias
    "May the Force be with you"
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"


    terça-feira, 20 de outubro de 2015 21:41
  • Oi Jefferson,

    Onde você citou array, você poderia usar uma tabela temporária para incluir os campos pgto_codigo, os dias e os dias de vencimento já calculados.

    • Marcado como Resposta Marcos SJ terça-feira, 27 de outubro de 2015 13:17
    quinta-feira, 22 de outubro de 2015 23:41
  • Bom dia,

    Por falta de retorno do usuário, esta thread será encerrada.

    Caso seja necessário, por gentileza, abra uma thread nova.

    Atenciosamente

    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 27 de outubro de 2015 13:16