Array
(
)

duvida com join

Brainrj
   - 09 set 2009

ola pessoal... estou eu aqui novamente precisando de uma ajudinha de vcs... apos o emerson facilitar minha vida com os jois, acho que acabei viajando demais e me enrrolei com uma query aqui...

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

#Código

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
   - 09 set 2009

esqueci de dizer no exemplo esta com inner join mas se eu usar o left join ele ignora o relacionamento...

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???

Renato Tavares
   - 10 set 2009

Olá..
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:

Brainrj
   - 10 set 2009

ja tentei assim... mas nesse caso ele ignora o q esta no #p3 e lista todos valores

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.

Emerson
   - 15 set 2009

lembre-se que não conhecemos suas tabela e não sabemos de onde os campos estão vindo. para facilitar isso, sempre utilize o aliases das tabelas ao utilizar os campos.

#Código

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.

Brainrj
   - 15 set 2009

Uso o #p3 sim...

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...

Emerson
   - 15 set 2009

agora entendi... tente assim:
#Código

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