Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Luciana1

Elaboração de uma Consulta

Recommended Posts

Olá colegas,Tendo as tabelas, conforme abaixo, eu preciso elaborar uma consulta que me retorne as pessoas que estão devendo 3 meses seguidos ou mais. Ou seja, que devem por exemplo os meses 123 ou 12345678.O mínimo que é devam 3 meses seguidos, mas se devem mais que 3 meses também devem sair, desde de que seja meses seguidos. Não sei se fui claraobs. quando a pessoa deve, a coluna status_cob é igual a 'G'; quando paga a coluna status_cob é igual a 'P'.tabela tbcadsoc, é o cadastro de pessoas (coloquei apenas os campos necessários)-mt_socios-nomeTabela tbcobsoc, é a tabela de registro de cobranças (coloquei apenas os campos necessários)-mt_socio_cob-ano_cob -mes_cob -status_cob-dt_pgto Grata,Luciana

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Luciana,

 

você pode fazer um loop com cursor ou não (dependendo do caso) e neste loop fazer verificações de com variaveis

 

neste artigo tem exemplos de loops com e sem cursores

http://www.mcdbabrasil.com.br/modules.php?...=article&sid=24

 

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Luciana,você pode fazer um loop com cursor ou não (dependendo do caso) e neste loop fazer verificações de com variaveisneste artigo tem exemplos de loops com e sem cursoreshttp://www.mcdbabrasil.com.br/modules.php?...=article&sid=24t+

Obrigada, ErivaEstou querendo usar apenas sql mesmo, mas se não for possível, usarei Vb, mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Luciana, creio q com o sql será possível fazer toda a verificação

 

fiz um pequeno exemplo veja:

set nocount ondeclare @tbcadsoc table(mt_socios int, nome varchar(50))declare @tbcobsoc table (mt_socio_cob int, ano_cob int, mes_cob int , status_cob char(1), dt_pgto datetime)declare @tab_dev table (mt_socios int)--inserindo os sociosinsert into @tbcadsoc (mt_socios, nome) values (1, 'Mateus')insert into @tbcadsoc (mt_socios, nome) values (2, 'Tiago')insert into @tbcadsoc (mt_socios, nome) values (3, 'João')insert into @tbcadsoc (mt_socios, nome) values (4, 'André')insert into @tbcadsoc (mt_socios, nome) values (5, 'Filipe')insert into @tbcadsoc (mt_socios, nome) values (6, 'Pedro')insert into @tbcadsoc (mt_socios, nome) values (7, 'Judas')insert into @tbcadsoc (mt_socios, nome) values (8, 'Tomé')--inserindo as parcelas, vamos inserir somente as parcelas em débito, pois as que já estão pagas naum vaum interessar--socio codigo 1 deve 3 meses seguidos (ano diferente, mas tá seguido os débitos)insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (1, 2000, 11, 'G', '2000/12/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (1, 2000, 12, 'G', '2001/01/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (1, 2001, 01, 'G', '2001/02/10')--socio codigo 2 deve 3 meses seguidos (ano igual)insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (2, 2000, 1, 'G', '2000/02/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (2, 2000, 2, 'G', '2000/03/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (2, 2000, 3, 'G', '2000/04/10')--socio codigo 3 deve 3 meses mas NÃO seguidosinsert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (3, 2000, 1, 'G', '2000/02/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (3, 2000, 2, 'G', '2000/03/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (3, 2000, 4, 'G', '2000/05/10')--socio codigo 4 deve 2 meses seguidosinsert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (4, 2000, 1, 'G', '2000/02/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (4, 2000, 2, 'G', '2000/03/10')--socio codigo 5 deve 1 mes apenas (ta seguido dos meses e ano do anterior codigo 4, mas como o socio é diferente)insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (5, 2000, 3, 'G', '2000/04/10')--socio codigo 6 deve 3 meses mas naum seguidos, pois a 1a. parcela é do ano de 1999 e as outras de 2001insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (6, 1999, 12, 'G', '2000/01/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (6, 2001, 01, 'G', '2002/02/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (6, 2001, 02, 'G', '2002/03/10')--socio codigo 7 deve 3 meses seguidos (mais 1 exemplo de 3 meses seguidos)insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (7, 2003, 12, 'G', '2004/01/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (7, 2004, 01, 'G', '2004/02/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (7, 2004, 02, 'G', '2004/03/10')--socio codigo 8 deve 3 meses aleatoriosinsert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (8, 1999, 11, 'G', '1999/12/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (8, 2002, 09, 'G', '2002/10/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (8, 2002, 11, 'G', '2002/12/10')declare @ano_cob_ANT int, 	@mes_cob_ANT int,	@qtd_atrasos int,	@mt_socio_cob_ANT intset @ano_cob_ANT = -1set @mes_cob_ANT = -1set @mt_socio_cob_ANT = -1set @qtd_atrasos = 1declare x cursor for select mt_socio_cob, ano_cob, mes_cob  from @tbcobsoc where status_cob = 'G' --somente verifica as parcelas em débito			order by mt_socio_cob, ano_cob, mes_cob --ordenação por sócio, ano e mês para que a sequencia possa ser comparadadeclare @mt_socio_cob int, 	@ano_cob int,	@mes_cob intopen x Fetch next from x into @mt_socio_cob, @ano_cob, @mes_cob while @@fetch_Status=0 Begin	if (@mt_socio_cob = @mt_socio_cob_ANT) --verificação para ver se é o mesmo sócio		and (@ano_cob_ANT = case when (@mes_cob_ANT + 1) > 12 then @ano_cob-1 else @ano_cob end) --verificação do ano, se mes anterior maior que 12 entaum deduz 1 do ano pra seguir a sequencia...heheh seguir a sequencia é f*** hein		and (@mes_cob = case when (@mes_cob_ANT + 1) > 12 then 1 else (@mes_cob_ANT + 1) end) --verificação do mes, se mes anterior maior que 12 entaum coloca 1 para fazera comparação	begin		set @qtd_atrasos = @qtd_atrasos + 1	end	else	begin		set @qtd_atrasos = 1  --se naum for da msm sequencia entaum volta pra 1	end 	if @qtd_atrasos = 3 --caso passar de 3 naum vai entrar aqui duplicando, pode ser otimizado pq. se tiver 30 parcelas em seguida em atraso vai ficar passando aqui, só que naum vai entrar....hehhe	begin		insert into @tab_dev (mt_socios) values (@mt_socio_cob)	end	--guarda valores anteriores para fazer comparações	set @ano_cob_ANT = @ano_cob	set @mes_cob_ANT = @mes_cob	set @mt_socio_cob_ANT = @mt_socio_cob	Fetch next from x into @mt_socio_cob, @ano_cob, @mes_cob end close x deallocate x --listando os devedoresselect * from @tab_dev tdinner join @tbcadsoc ts on td.mt_socios = ts.mt_socios
talvez falte alguma verificação, pois fiz meio rápido...

 

obs.: usei os campos mt_socios e mt_socio_cob como chave

 

 

t++

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Luciana, creio q com o sql será possível fazer toda a verificaçãofiz um pequeno exemplo veja:

set nocount ondeclare @tbcadsoc table(mt_socios int, nome varchar(50))declare @tbcobsoc table (mt_socio_cob int, ano_cob int, mes_cob int , status_cob char(1), dt_pgto datetime)declare @tab_dev table (mt_socios int)--inserindo os sociosinsert into @tbcadsoc (mt_socios, nome) values (1, 'Mateus')insert into @tbcadsoc (mt_socios, nome) values (2, 'Tiago')insert into @tbcadsoc (mt_socios, nome) values (3, 'João')insert into @tbcadsoc (mt_socios, nome) values (4, 'André')insert into @tbcadsoc (mt_socios, nome) values (5, 'Filipe')insert into @tbcadsoc (mt_socios, nome) values (6, 'Pedro')insert into @tbcadsoc (mt_socios, nome) values (7, 'Judas')insert into @tbcadsoc (mt_socios, nome) values (8, 'Tomé')--inserindo as parcelas, vamos inserir somente as parcelas em débito, pois as que já estão pagas naum vaum interessar--socio codigo 1 deve 3 meses seguidos (ano diferente, mas tá seguido os débitos)insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (1, 2000, 11, 'G', '2000/12/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (1, 2000, 12, 'G', '2001/01/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (1, 2001, 01, 'G', '2001/02/10')--socio codigo 2 deve 3 meses seguidos (ano igual)insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (2, 2000, 1, 'G', '2000/02/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (2, 2000, 2, 'G', '2000/03/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (2, 2000, 3, 'G', '2000/04/10')--socio codigo 3 deve 3 meses mas NÃO seguidosinsert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (3, 2000, 1, 'G', '2000/02/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (3, 2000, 2, 'G', '2000/03/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (3, 2000, 4, 'G', '2000/05/10')--socio codigo 4 deve 2 meses seguidosinsert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (4, 2000, 1, 'G', '2000/02/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (4, 2000, 2, 'G', '2000/03/10')--socio codigo 5 deve 1 mes apenas (ta seguido dos meses e ano do anterior codigo 4, mas como o socio é diferente)insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (5, 2000, 3, 'G', '2000/04/10')--socio codigo 6 deve 3 meses mas naum seguidos, pois a 1a. parcela é do ano de 1999 e as outras de 2001insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (6, 1999, 12, 'G', '2000/01/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (6, 2001, 01, 'G', '2002/02/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (6, 2001, 02, 'G', '2002/03/10')--socio codigo 7 deve 3 meses seguidos (mais 1 exemplo de 3 meses seguidos)insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (7, 2003, 12, 'G', '2004/01/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (7, 2004, 01, 'G', '2004/02/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (7, 2004, 02, 'G', '2004/03/10')--socio codigo 8 deve 3 meses aleatoriosinsert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (8, 1999, 11, 'G', '1999/12/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (8, 2002, 09, 'G', '2002/10/10')insert into @tbcobsoc (mt_socio_cob, ano_cob, mes_cob, status_cob, dt_pgto)values (8, 2002, 11, 'G', '2002/12/10')declare @ano_cob_ANT int, 	@mes_cob_ANT int,	@qtd_atrasos int,	@mt_socio_cob_ANT intset @ano_cob_ANT = -1set @mes_cob_ANT = -1set @mt_socio_cob_ANT = -1set @qtd_atrasos = 1declare x cursor for select mt_socio_cob, ano_cob, mes_cob  from @tbcobsoc where status_cob = 'G' --somente verifica as parcelas em débito			order by mt_socio_cob, ano_cob, mes_cob --ordenação por sócio, ano e mês para que a sequencia possa ser comparadadeclare @mt_socio_cob int, 	@ano_cob int,	@mes_cob intopen x Fetch next from x into @mt_socio_cob, @ano_cob, @mes_cob while @@fetch_Status=0 Begin	if (@mt_socio_cob = @mt_socio_cob_ANT) --verificação para ver se é o mesmo sócio		and (@ano_cob_ANT = case when (@mes_cob_ANT + 1) > 12 then @ano_cob-1 else @ano_cob end) --verificação do ano, se mes anterior maior que 12 entaum deduz 1 do ano pra seguir a sequencia...heheh seguir a sequencia é f*** hein		and (@mes_cob = case when (@mes_cob_ANT + 1) > 12 then 1 else (@mes_cob_ANT + 1) end) --verificação do mes, se mes anterior maior que 12 entaum coloca 1 para fazera comparação	begin		set @qtd_atrasos = @qtd_atrasos + 1	end	else	begin		set @qtd_atrasos = 1  --se naum for da msm sequencia entaum volta pra 1	end 	if @qtd_atrasos = 3 --caso passar de 3 naum vai entrar aqui duplicando, pode ser otimizado pq. se tiver 30 parcelas em seguida em atraso vai ficar passando aqui, só que naum vai entrar....hehhe	begin		insert into @tab_dev (mt_socios) values (@mt_socio_cob)	end	--guarda valores anteriores para fazer comparações	set @ano_cob_ANT = @ano_cob	set @mes_cob_ANT = @mes_cob	set @mt_socio_cob_ANT = @mt_socio_cob	Fetch next from x into @mt_socio_cob, @ano_cob, @mes_cob end close x deallocate x --listando os devedoresselect * from @tab_dev tdinner join @tbcadsoc ts on td.mt_socios = ts.mt_socios
talvez falte alguma verificação, pois fiz meio rápido...obs.: usei os campos mt_socios e mt_socio_cob como chavet++
Olá,Agradeço sinceramente. Você é muito gentil.Você acha que só com linguagem sql não seria possível?Eu sigo a regra de somente de usar transact sql ou outra linguagem quando não é possível usar apenas SQL.Mas vou usar o seu código, não posso mais perder tempo.Forte abraço,Luciana

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,Agradeço sinceramente. Você é muito gentil.Você acha que só com linguagem sql não seria possível?Eu sigo a regra de somente de usar transact sql ou outra linguagem quando não é possível usar apenas SQL.Mas vou usar o seu código, não posso mais perder tempo.Forte abraço,Luciana

Oi Luciana,entaum aprendi direto T-SQL, vi e li pouco sobre o SQL padrão, como você faz para verificar se o codigo é T-SQL ou SQL, você usa o query analiser mesmo ou alguma outra ferramenta?abraço,Erivelton

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi,Eu acho que não fui clara, eu uso T-sql também, é que onde trabalho nós costumamos chamar de t-sql somente quando precisamos usar lógica condicional com loops, váriaveis, ifs e a chamar de sql quando precisamos somente consultar dados sem utilizar (loops, ifs e variáveis).O Analyser, que eu saiba, interpreta o sql padrão (ANSI), desde que não seja utilizadas funções específicas do ANSI.Então a pegunta deveria ser: não é possível usar apenas SQL sem lógica condicional?obs. nas respostas deste fórum como acrescento um título específico?Até mais,Luciana

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então a pegunta deveria ser: não é possível usar apenas SQL sem lógica condicional?

putz, num sei naum, tentei aqui mas nem consegui, caso você conseguir me avise por favor, se eu conseguir algo aqui tb. te aviso

obs. nas respostas deste fórum como acrescento um título específico?

tb. naum seit+

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.