[Resolvido] Ajuda em formulação de consulta sql

6 respostas
M

Olá pessoal,

estou tendo que fazer a manutenção em um relatório do jasperreports, o problema é que terei que extrair um valor da query, porém não estou conseguindo formular a mesma. A consulta no momento é a seguinte:

SELECT 

*, vp.pesoLiquido, p.idProduto, p.nome, vp.valorUnitario, SUM(pesoLiquido) FROM
venda v INNER JOIN entidade e LEFT JOIN venda_has_produto vp ON vp.idVenda=v.idVenda LEFT JOIN produto p ON vp.idProduto=p.idProduto

WHERE

... DIVERSOS PARAMETROS NÃO RELEVANTES PARA O EXEMPLO (mas se for preciso posto aqui depois)...

ORDER BY v.idVenda

O que preciso fazer agora?
É o seguinte, preciso saber o total da coluna vp.pesoLiquido para cada valor diferente de vp.idProduto nesta consulta, ou seja, para os parâmetros dentro do where.

Obs: porque devo fazer isso no jasper e não no java? Simples, por que este é um terceiro subrelatório que dependendo da ocasião pode vir a ser usado ou não, e é praticamente impossível calcular isso no java e ir passando por parâmetro para o relatório, visto que este é altamente dinâmico e maleável, e por isso contém tantos sub relatórios.

6 Respostas

cleo.junior

Maycon, veja se isso resolve. Dei uma modificada no seu SQL para ficar mais claro.

select
  *, 
  // vp.pesoLiquido, // <- Essa coluna é mesmo necesária?
  p.idProduto,
  p.nome,  
  vp.valorUnitario, 
  sum(vp.pesoLiquido) 
from 
  venda v 
inner join 
  entidade e on 
    <?> // <- Falta o cruzamento desta tabela, não?
left join
  venda_has_produto vp ON 
    vp.idVenda = v.idVenda 
left join 
  produto p on
    vp.idProduto=p.idProduto  
where
 <filtro>
group by
  p.idProduto,
  p.nome,  
  vp.valorUnitario
order by
  v.idVenda
erico_kl

Tente usando o group by…

Agrupe pelo código do produto e some a coluna pesoLiquido. Talvez seja necessário um subselect para isso.

Você está largando a SQL diretamente no jasper por ser um subrelatório? Você pode tranquilamente passar uma lista do seu master para o sub e este conter os dados pertinentes à sublista. Acredito não ser uma boa prática colocar queries dentro de relatórios, pois de certa forma isso é uma quebra de camadas… O que uma query solta está fazendo na view?

Quanto ao seu valor total, você também poderia usar variáveis do próprio jasper para somar este valor agrupado… Aí vai de você escolher a forma que se encaixe melhor no seu problema…

M

Olá @cleo.junior,

eu fiz o que você me indicou e o resultado funcionou parcialmente, pois agora todas as devidas linhas são listadas (resultado do group-by), porém o SUM(vp.pesoLiquido) não está realizando a esperada soma. Aliás, não falta cruzamento no INNER JOIN de entidade com venda pois ela já cruza automaticamente o atributo de relacionamento entre as duas tabelas.

Seguindo as suas dicas com algumas adaptações, no momento a consulta está assim:

SELECT 
*, 
p.idProduto, 
p.nome, 
vp.pesoLiquido, 
vp.valorUnitario,
sum(vp.pesoLiquido)

FROM
venda v 
INNER JOIN entidade e 
LEFT JOIN venda_has_produto vp ON vp.idVenda=v.idVenda 
LEFT JOIN produto p ON vp.idProduto=p.idProduto

WHERE

e.idEntidade=1

GROUP BY
v.idVenda,
p.idProduto,  
p.nome,    
vp.valorUnitario

ORDER BY v.idVenda

*obs: a cláusula WHERE continua fictícia.

@erico_kl,

para o meu caso é muito mais prático utilizar uma subquery dentro da query do subrelatório, até usei o GROUP BY recomendado pelo nosso amigo @cleo.junior, porém o problema ainda foi resolvido apenas parcialmente.

M

Pessoal,

eu ainda não consegui resolver o problema. Se vocês poderem me ajudar, ficarei muito grato.

Lembrando que o que eu quero é simplesmente lista o SUM(vp.pesoLiquido) para cada valor diferente de vp.idProduto.

@cleo.junior, você realmente está certo, tive que inserir “ON e.idEntidade=v.idEntidade” no primeiro inner join.

cleo.junior

mayconfsbrito:
Pessoal,

eu ainda não consegui resolver o problema. Se vocês poderem me ajudar, ficarei muito grato.

Lembrando que o que eu quero é simplesmente lista o SUM(vp.pesoLiquido) para cada valor diferente de vp.idProduto.

@cleo.junior, você realmente está certo, tive que inserir “ON e.idEntidade=v.idEntidade” no primeiro inner join.

Maycon, como está o seu sql atual? Experimente tirar a coluna vp.valorUnitario do select e do group by.

M

Eu resolvi o problema da seguinte forma:

Criei um outro subrelatório dentro deste subrelatório, e dentro dele coloquei a consulta formulada por nós aqui:

SELECT 
vp.pesoLiquido, 
p.idProduto, 
p.nome, 
sum(vp.pesoLiquido) 
FROM
venda v INNER JOIN entidade e ON e.idEntidade=v.idEntidade 
LEFT JOIN venda_has_produto vp ON vp.idVenda=v.idVenda 
LEFT JOIN produto p ON vp.idProduto=p.idProduto

WHERE

//Os mesmos parâmetros da primeira consulta

GROUP BY vp.idProduto

ORDER BY v.idVenda

Muito obrigado pela ajuda pessoal.

Criado 20 de agosto de 2012
Ultima resposta 23 de ago. de 2012
Respostas 6
Participantes 3