Fórum Query com mais de um sum relacionando tabelas #338021

19/02/2007

0

Bom to terminando um projetinho que eu to treinando, e ele é de receitas, sei que deve ser facil, mas como sou iniciante é complicado imaginar como posso resolver isso :)

:arrow: Uso [b:9f21643087]Delphi 6 + Interbase 6 + IBQuery[/b:9f21643087]

A ideia é cadastrar uma receita e ter quantos igredientes quiser, então estou treinando o mestre / detalhe com multiplas tabelas

Bom vou organizar aqui... tenham paciencia :)

[b:9f21643087]MReceita[/b:9f21643087] (Tabela master)
-------------
IDMRECEITAINTEGERNOT NULL - PK
NOMERECEITAVARCHAR(100)NOT NULL
IDTIPOPRATOINTEGER NOT NULL - FK (tabela tipoprato)
PREPAROVARCHAR(5000)NOT NULL

[b:9f21643087]DReceita[/b:9f21643087] (Tabela Detalhe)
-------------
IDDRECEITAINTEGERNOT NULL - PK
IDMRECEITAINTEGERNOT NULL - FK (tabela MReceita)
IDIGREDIENTEINTEGERNOT NULL - FK (tabela Igrediente)
IDTIPOQUANTIDADEINTEGER NOT NULL - FK (tabela TipoQuantidade)
QUANTIDADEVARCHAR(10)NOT NULL

[b:9f21643087]Igrediente[/b:9f21643087] (Tabela Detalhe) (Cadastro dos igredientes)
-------------
IDIGREDIENTEINTEGER NOT NULL - FK (tabela DReceita)
IGREDIENTEVARCHAR(100)NOT NULL

[b:9f21643087]TipoQuantidade[/b:9f21643087] (Tabela Detalhe) (ex: colher, pitada, xicara, litro..)
-------------
IDTIPOQUANTIDADEINTEGER NOT NULL - FK (Tabela DReceita)
TIPOQUANTIDADEVARCHAR(100)NOT NULL

:arrow: A ideia do projeto é o usuario ficar livre e poder fazer do jeito dele.

:arrow: Bom a minha duvida é: Eu tenho um relatorio onde eu escolheria as receitas e no final do relatorio preciso saber
- Quanto de cada igrediente eu preciso comprar

ex do relatorio
Nome da receita: Macarrão
Igredientes | Quantidade | Tipo quantidade
Cebola | 1 | unidade
Alho | 30 | gramas
Tomate | 4 | xicaras

Nome da receita: Panqueca
Igredientes | Quantidade | Tipo quantidade
Cebola | 2 | unidade
Tomate | 2 | xicaras
Leite | 500 | ml

No final do relatorio queria algo assim
Cebola => 3 unidades
Alho => 30 gramas
Tomate => 6 xicaras
Leite => 500 ml

Deu para entender? :)

Desculpa o post gigante é para tentar explicar da melhor forma possivel


Corcos

Corcos

Responder

Posts

19/02/2007

Pestana_

Não consegui entender o que realmente você quer?

você quer saber a qtde de cada igrediente a ser comprado? o campo QUANTIDADE da tabela DReceita não informaria isso pra você?


aguardo,
flw.


Responder

Gostei + 0

19/02/2007

Emerson Nascimento

olha, dependendo do gerador de relatórios que você usa, essa pode ser uma tarefa bem simples.

de qualquer forma, vai aí uma solução em que você utilizaria duas instruções: uma para o relatório em si e outra para o resumo.

select
  mr.NomeDaReceita,
  i.Ingrediente,
  dr.Quantidade,
  tq.TipoQuantidade
from
  MReceita mr
left join
  DReceita dr on (dr.IDMReceita = mr.IDMReceita)
left join
  Ingrediente i on (i.IDIngrediente = dr.IDIngrediente)
left join
  TipoQuantidade tq on (tq.IDTipoQuantidade = dr.IDTipoQuantidade)
order by
  mr.NomeReceita
essa instrução listaria o relatório propriamente dito.

agora, para o resumo, faça:
select
  i.IDIngrediente,
  i.Ingrediente,
  sum(dr.Quantidade) QuantidadeTotal,
  tq.TipoQuantidade
from
  DReceita dr
left join
  Ingrediente i on (i.IDIngrediente = dr.IDIngrediente)
left join
  TipoQuantidade tq on (tq.IDTipoQuantidade = dr.IDTipoQuantidade)
group by
  i.IDIngrediente,
  i.Ingrediente,
  tq.TipoQuantidade
order by
  i.Ingrediente



Responder

Gostei + 0

19/02/2007

Corcos

Emerson e Pestana obrigado pelas respostas

:seta: [b:0b558c5baf]Eu uso o QuickReport mesmo[/b:0b558c5baf]

O select que eu to usando para o relatorio é esse, e esta funcionando 100¬, o que eu quero é só o somatorio no final

SELECT D.IDDRECEITA, M.IDMRECEITA, M.NOMERECEITA, M.PREPARO, D.QUANTIDADE, T.TIPOPRATO, I.IGREDIENTE, Q.TIPOQUANTIDADE, COUNT(D.QUANTIDADE) AS QTD FROM DRECEITA D, MRECEITA M, TIPOPRATO T, IGREDIENTE I, TIPOQUANTIDADE Q WHERE D.IDMRECEITA = M.IDMRECEITA AND D.IDIGREDIENTE = I.IDIGREDIENTE AND M.IDTIPOPRATO = T.IDTIPOPRATO AND D.IDTIPOQUANTIDADE = Q.IDTIPOQUANTIDADE GROUP BY M.IDMRECEITA, D.IDDRECEITA, M.NOMERECEITA, M.PREPARO, D.QUANTIDADE, T.TIPOPRATO, I.IGREDIENTE, Q.TIPOQUANTIDADE ORDER BY M.IDMRECEITA, M.NOMERECEITA


Em nenhuma tabela eu guardo o total por igrediente, por isso preciso de um sum na tabela DReceita onde é FK para a tabela igrediente.

Ou seja, preciso pegar as receitas da semana, dentro dessas receitas tem os igredientes e somar todos os igredientes (agrupando eles).


Responder

Gostei + 0

19/02/2007

Corcos

Emerson no resultado do seu select saiu assim

IDIGREDIENTE IGREDIENTE QUANTIDADETOTAL TIPOQUANTIDADE ============ ============================= ================ ================= 60 aceto balsamico 22 colher de sopa 64 agua 1 litro 53 amora 5 pitada 41 azeite 22 colher de sopa 2 cebola 3 litro 2 cebola 34 Xícara 2 cebola 77 pitada 4 cenoura 22 pitada 4 cenoura 34 colher de sopa 4 cenoura 43 litro 3 pepino 33 Xícara 3 pepino 34 colher de sopa 3 pepino 103 pitada 3 pepino 140 litro



Responder

Gostei + 0

19/02/2007

Corcos

Emerson achei onde eu estava errando, seu select ajudou!!!

Valeu mesmo pela força


Responder

Gostei + 0

19/02/2007

Corcos

Tinha que habilitar o botão de edit :roll:

Fiz o relatorio e ficou super show!

Agora veio outra questão, como eu poderia montar tipo um grid, onde eu selecionado os pratos ele gere a receita somente dos que eu selecionei.

Como eu colocaria um where com varias receitas selecionadas?

vcs indicam um dbgrid ou um list mesmo


Responder

Gostei + 0

19/02/2007

Emerson Nascimento

mas o que você teria como partida? o nome da receita ou o id?

sua instrução poderá ser condicionada assim:

where idreceita/nomereceita in (lista de receitas)

de modo que, dependendo do caso, seja montada da seguinte forma:

[b:0f908cf018]where idmreceita in (2, 14, 5, 9) [/b:0f908cf018]//no caso de IDs

ou

[b:0f908cf018]where nomereceita in (´MACARRONADA´, ´ARROZ DOCE´, ´BATATA SAUTE´)[/b:0f908cf018] // no caso de escolher por nome

a exibição fica a seu critério, mas acho que um grid não seria a melhor opção nesse caso.


Responder

Gostei + 0

19/02/2007

Corcos

Seria mais ou menos isso abaixo

[b:471c1e3df7]FrmPesqReceita[/b:471c1e3df7]
- Eu tenho um grid ou qualquer componente para exibir todas as receitas cadastradas(o que vcs indicam).
- O usuario vai escolhendo as receitas que vai utilizar
- Clica em ok e gera o relatorio com os igredientes que essas receitas utilizam, fazendo uma lista de compras.

Essa sua query funciona show de bola
select i.IDIgrediente, i.Igrediente, sum(dr.Quantidade) QuantidadeTotal, tq.TipoQuantidade from DReceita dr left join Igrediente i on (i.IDIgrediente = dr.IDIgrediente) left join TipoQuantidade tq on (tq.IDTipoQuantidade = dr.IDTipoQuantidade) group by i.IDIgrediente, i.Igrediente, tq.TipoQuantidade order by i.Igrediente


Mas preciso trazer somente os igredientes das receitas selecionadas, ai fica a duvida onde e como vou fazer isso

Seria mais ou menos assim? Mas como vou fazer um where se eu não sei a quantidade de receitas... :)

select
i.IDIgrediente,
i.Igrediente,
sum(dr.Quantidade) QuantidadeTotal,
tq.TipoQuantidade
from
DReceita dr
where
[color=indigo:471c1e3df7][b:471c1e3df7] i.iDIgrediente = :VarID1 and
i.iDIgrediente = :VarID2[/b:471c1e3df7][/color:471c1e3df7]
left join
Igrediente i on (i.IDIgrediente = dr.IDIgrediente)
left join
TipoQuantidade tq on (tq.IDTipoQuantidade = dr.IDTipoQuantidade)
group by
i.IDIgrediente,
i.Igrediente,
tq.TipoQuantidade
order by
i.Igrediente

Valeu de novo pela ajuda, quando eu terminar vou disponibilizar o fonte para a galera poder consultar e treinar tb... :)


Responder

Gostei + 0

19/02/2007

Emerson Nascimento

select 
  i.IDIgrediente, 
  i.Igrediente, 
  sum(dr.Quantidade) QuantidadeTotal, 
  tq.TipoQuantidade 
from 
  DReceita dr 
left join 
  Igrediente i on (i.IDIgrediente = dr.IDIgrediente) 
left join 
  TipoQuantidade tq on (tq.IDTipoQuantidade = dr.IDTipoQuantidade) 
where 
  i.iDMReceita = :VarID1 or
  i.iDMReceita = :VarID2 
group by 
  i.IDIgrediente, 
  i.Igrediente, 
  tq.TipoQuantidade 
order by 
  i.Igrediente


ou

select 
  i.IDIgrediente, 
  i.Igrediente, 
  sum(dr.Quantidade) QuantidadeTotal, 
  tq.TipoQuantidade 
from 
  DReceita dr 
left join
  MReceita mr on (mr.IDMReceita = dr.IDMReceita)
left join 
  Igrediente i on (i.IDIgrediente = dr.IDIgrediente) 
left join 
  TipoQuantidade tq on (tq.IDTipoQuantidade = dr.IDTipoQuantidade) 
where 
  mr.NomeReceita in (´MACARRAO´, ´PANQUECA´)
group by 
  i.IDIgrediente, 
  i.Igrediente, 
  tq.TipoQuantidade 
order by 
  i.Igrediente



Responder

Gostei + 0

19/02/2007

Corcos

Sim isso eu entendi.

O problema é que posso escolher quantas receitas quiser, como vou por no [b:13fc506bb7]where [/b:13fc506bb7]uma quantidade infinita de condições de escolha, conseguiu entender?

Eu posso escolher 1 ou 30 receitas para gerar a lista de compras, vou ter que declarar 30 variaveis e assim limitar o número de receitas escolhidas?

Funciona assim, tem um grid, e o usuario vai segurando ctrl e escolhendo as receitas, vamos dar exemplo que ele escolheu 12 receitas, quando ele da o ok, gera o relatorio com a sua query, mas preciso dos igrediente somente dessas receitas que foram selecionadas

Conseguiu entender?

Desculpa estar enchendo o saco com o assunto :) é que eu realmente por não conhecer profudamente o delphi/sql não sei :(


Responder

Gostei + 0

21/02/2007

Corcos

veja se alguem pode me ajudar agora, essa questão da de cima já resolvi :)


Como eu conheço pouco SQL fica complicado tentar imaginar como..

Emerson fez essa query que esta ok.

select i.IDIgrediente, i.Igrediente, sum(dr.Quantidade) QuantidadeTotal, tq.TipoQuantidade from DReceita dr left join Igrediente i on (i.IDIgrediente = dr.IDIgrediente) left join TipoQuantidade tq on (tq.IDTipoQuantidade = dr.IDTipoQuantidade) group by i.IDIgrediente, i.Igrediente, tq.TipoQuantidade order by i.Igrediente


Eu preciso agora que ela procure na tabela MReceita o campo DataCompra quando ele fica nulo

Eu tentei assim

select i.IDIgrediente, i.Igrediente, sum(dr.Quantidade) QuantidadeTotal, tq.TipoQuantidade from DReceita dr, [b:a7a5c29344]MReceita mr[/b:a7a5c29344] left join Igrediente i on (i.IDIgrediente = dr.IDIgrediente) left join TipoQuantidade tq on (tq.IDTipoQuantidade = dr.IDTipoQuantidade) [b:a7a5c29344]where dr.idmreceita = mr.idmreceita and mr.datacompra is not null[/b:a7a5c29344] group by i.IDIgrediente, i.Igrediente, tq.TipoQuantidade order by i.Igrediente


Só que ele da erro, alguem tem ideia de como montar isso?


Responder

Gostei + 0

21/02/2007

Corcos

Nunca tinha trabalhado com left join... alguem tem algum lugar bom para ler um bom manual de sql ?

Fiz uns testes e usei a logica do Emerson e funcionou


select i.IDIgrediente, i.Igrediente, sum(dr.Quantidade) QuantidadeTotal, tq.TipoQuantidade from DReceita dr left join Igrediente i on (i.IDIgrediente = dr.IDIgrediente) left join TipoQuantidade tq on (tq.IDTipoQuantidade = dr.IDTipoQuantidade) left join MReceita mr on (mr.idmreceita = dr.idmreceita) where mr.datacompra is not null group by i.IDIgrediente, i.Igrediente, tq.TipoQuantidade order by i.Igrediente



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar