Query com mais de um sum relacionando tabelas
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
: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
Curtidas 0
Respostas
Pestana_
19/02/2007
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.
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.
GOSTEI 0
Emerson Nascimento
19/02/2007
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.
essa instrução listaria o relatório propriamente dito.
agora, para o resumo, faça:
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
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
GOSTEI 0
Corcos
19/02/2007
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
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).
: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).
GOSTEI 0
Corcos
19/02/2007
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
GOSTEI 0
Corcos
19/02/2007
Emerson achei onde eu estava errando, seu select ajudou!!!
Valeu mesmo pela força
Valeu mesmo pela força
GOSTEI 0
Corcos
19/02/2007
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
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
GOSTEI 0
Emerson Nascimento
19/02/2007
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.
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.
GOSTEI 0
Corcos
19/02/2007
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
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... :)
[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... :)
GOSTEI 0
Emerson Nascimento
19/02/2007
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
GOSTEI 0
Corcos
19/02/2007
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 :(
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 :(
GOSTEI 0
Corcos
19/02/2007
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.
Eu preciso agora que ela procure na tabela MReceita o campo DataCompra quando ele fica nulo
Eu tentei assim
Só que ele da erro, alguem tem ideia de como montar isso?
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?
GOSTEI 0
Corcos
19/02/2007
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
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
GOSTEI 0