duvida com join
09/09/2009
0
meu problema eh o seguinte... quero que uma query sempre retorne resultado na coluna descricao independente de achar ou nao valores nas demais tabelas... para isso usei o left join funcionou legal ate eu precisar incluir mais um relacionamento(array #p3 em negrito)... dai quando dele nao retorna nada a coluna descricao nao linta o conteudo... o que preciso alterar?
segue query
declare @p1 datetime, @p2 datetime, @p3 varchar(50), @p4 varchar(50),@S VARCHAR(5); set @p1 = ´1/1/2009´; set @p2 = ´1/31/2009´; set @p3 = ´1,2´;set @p4 = ´1,2,3,4,5,6,7,8´ if object_id(´tempdb..p3´) is not null drop table p3 CREATE TABLE p3(ARRAY int) IF LEN(@p3) > 0 SET @p3 = @p3 + ´,´ WHILE LEN(@p3) > 0 BEGIN SELECT @S = LTRIM(SUBSTRING(@p3, 1, CHARINDEX(´,´, @p3) - 1)) INSERT INTO #p3 (ARRAY) VALUES (@S) SELECT @p3 = SUBSTRING(@p3, CHARINDEX(´,´, @p3) + 1, LEN(@p3)) END if object_id(´tempdb..p4´) is not null drop table p4 CREATE TABLE p4(ARRAY int) IF LEN(@p4) > 0 SET @p4 = @p4 + ´,´ WHILE LEN(@p4) > 0 BEGIN SELECT @S = LTRIM(SUBSTRING(@p4, 1, CHARINDEX(´,´, @p4) - 1)) INSERT INTO p4 (ARRAY) VALUES (@S) SELECT @p4 = SUBSTRING(@p4, CHARINDEX(´,´, @p4) + 1, LEN(@p4)) END select cod, descricao, sum(case when dtvenc>@p1 and dtvenc<@p2 then 1 else 0 end) parc, sum(case when dtvenc>@p1 and dtvenc<@p2 then vlrprest else 0 end)total, sum(case when dtvenc>@p1 and dtvenc<@p2 and (dtpagto is null or dtvenc<@p1 or dtvenc>@p2) then vlrprest else 0 end)inad, sum(case when dtpagto>@p1 and dtpagto<@p2 and vlrjuros is not null then vlrjuros else 0 end)juros, sum(case when dtpagto>@p1 and dtpagto<@p2 and vlrmulta is not null then vlrmulta else 0 end)multa from contratos_modelo cm left join contratos c on cm.cod=c.codmodelo inner join prestacoes p on c.num=p.numcont inner join #p4 p4 on cm.cod=p4.ARRAY inner join p3 p3 on c.codgrupo=p3.ARRAY -- este relacionamento que nao esta retornando quando nao acha group by cod, descricao order by cod
Brainrj
Posts
09/09/2009
Brainrj
o relacionamento das tabelas contratos_modelo e contratos esta com left join, entao se nao achar nenhum contrato p aquele modelo ele exibe o modelo mesmo assim.
o problema e que estou relacionando as tabelas contratos e #p3 com inner join entao mesmo que nao resulte nada dessa combinacao o contratos_modelo nao deveria ser exibido mesmo assim???
10/09/2009
Renato Tavares
Boa Tarde..!! 8)
Você já tentou assim no lugar onde não esta retornando os valores:
left join #p3 p3 on c.codgrupo=p3.ARRAY
Testa ai..!! :wink:
10/09/2009
Brainrj
pra facilitar a visualização do meu problema... minhas tabelas tem os seguintes conteudos:
* contratos_modelo: sao os tipos de contrato q podem ser feito (por ex. 3x s/juros ) esta ligado a tabela de contratos
* contratos: como nome diz... sao os contratos e estao ligados as tabela modelos, de prestacoes e de grupos
* prestacoes: sao as parcelas do contrato estao ligada a tabela contratos
* grupos: grosseiramente falando... e o caixa2... grupo1 caixa normal e grupo2 e o caixa2... a opcao grupo1 esta sempre marcada... mas os valores do grupo2 so aparecem se vc for la e marcar a opcao... esta ligado a tabela de contratos.
15/09/2009
Emerson Nascimento
select cm.cod, cm.descricao, sum(case when p.dtvenc>@p1 and p.dtvenc<@p2 then 1 else 0 end) parc, sum(case when p.dtvenc>@p1 and p.dtvenc<@p2 then p.vlrprest else 0 end)total, sum(case when p.dtvenc>@p1 and p.dtvenc<@p2 and (p.dtpagto is null or p.dtvenc<@p1 or p.dtvenc>@p2) then p.vlrprest else 0 end) inad, sum(case when p.dtpagto>@p1 and p.dtpagto<@p2 and p.vlrjuros is not null then p.vlrjuros else 0 end) juros, sum(case when p.dtpagto>@p1 and p.dtpagto<@p2 and p.vlrmulta is not null then p.vlrmulta else 0 end) multa from contratos_modelo cm left join contratos c on cm.cod = c.codmodelo inner join prestacoes p on c.num = p.numcont inner join #p4 p4 on cm.cod = p4.ARRAY inner join p3 p3 on c.codgrupo = p3.ARRAY -- este relacionamento que nao esta retornando quando nao acha group by cm.cod, cm.descricao order by cm.cod
você está relacionando essa tabela p3 mas não a usa para nada.
o que exatamente você precisa fazer.
15/09/2009
Brainrj
set @p3 = ´1,2´;
if object_id(´tempdb..p3´) is not null drop table p3
CREATE TABLE p3(ARRAY int)
IF LEN(@p3) > 0 SET @p3 = @p3 + ´,´
WHILE LEN(@p3) > 0
BEGIN
SELECT @S = LTRIM(SUBSTRING(@p3, 1, CHARINDEX(´,´, @p3) - 1))
INSERT INTO p3 (ARRAY) VALUES (@S)
SELECT @p3 = SUBSTRING(@p3, CHARINDEX(´,´, @p3) + 1, LEN(@p3))
END
como eu falei p3 e o grupo... tenho grupo 1 e grupo 2
possu buscar pelos dois ou so por um no exemplo estou buscando pelos dois (1,2)
eu quero q os campos cod e descricao saiam mesmo que nao encontre nada.. como esta funcionando com a tabela p4 so q p4 se relaciona direto com a tabela contratos_modelo, onde estao os campos cod e decricao... entao o left join funciona... mas a tabela p3 se relaciona com a tabela contratos e ai a tabela contratos que se relaciona com a contratos_modelo...
eh complicado ate de explicar ne...
essa query eu uso pra fazer um relatorio no qreport
achei uma solucao meio q gambiarra aqui...
eu busco os contratos_modelo e ai a cada print da banda eu abro e fecho uma outra query onde busca os demais resultados daquele modelo...
15/09/2009
Emerson Nascimento
select cm.cod, cm.descricao, sum(case when p.dtvenc>@p1 and p.dtvenc<@p2 then 1 else 0 end) parc, sum(case when p.dtvenc>@p1 and p.dtvenc<@p2 then p.vlrprest else 0 end)total, sum(case when p.dtvenc>@p1 and p.dtvenc<@p2 and (p.dtpagto is null or p.dtvenc<@p1 or p.dtvenc>@p2) then p.vlrprest else 0 end) inad, sum(case when p.dtpagto>@p1 and p.dtpagto<@p2 and p.vlrjuros is not null then p.vlrjuros else 0 end) juros, sum(case when p.dtpagto>@p1 and p.dtpagto<@p2 and p.vlrmulta is not null then p.vlrmulta else 0 end) multa from contratos_modelo cm left join (select ct.* from contratos ct inner join #p3 p3 on p3.ARRAY = ct.codgrupo ) c on c.codmodelo = cm.cod inner join prestacoes p on c.num = p.numcont inner join p4 p4 on cm.cod = p4.ARRAY group by cm.cod, cm.descricao order by cm.cod
Clique aqui para fazer login e interagir na Comunidade :)