 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Ter Jul 31, 2018 1:45 pm Assunto: Dúvida SQL (MySQL) |
|
|
Opa pessoal, gostaria muito a ajuda de vcs em uma SQL. Trabalho com Mysql 5.7
Seguinte, tenho 4 tabelas
PRODUTOS
COD, NOME, TIPO (se é produto ou complemento)
MOVIMENTO
COD
DETMOVIMENTO (PRODUTOS DO MOVIMENTO)
COD, CODMOV, CODPROD, QUANT
DETCOMPLEMENTO (COMPLEMENTOS DOS PRODUTOS)
COD, CODDETMOV, CODPROD, QUANT
Exemplo de um movimento:
a venda de um sanduiche com um adicionar de queijo
PRODUTOS
COD NOME TIPO
10 sanduiche P
11 adicional queijo C
MOVIMENTO
COD
1
DETMOVIMENTO
COD CODMOV CODPROD QUANT
1 1 10 1
DETCOMPLEMENTO
COD CODDETMOV CODPROD QUANT
1 1 11 1
existe uma promoção que basicamente precisa ter um produto junto com um complemento + outro produto junto com outro complemento
ex:
se vc comprar um sanduiche com adicional de queijo que custa 20 reais junto com um sanduiche com adicional de ovo que custa 21 reais, os dois custam 35.
então basicamente eu quero uma SQL q me mostre quando esses dois produtos, junto com seus respectivos complementos, não estar adicionados.
obs: lembrando que dentro de um mesmo movimento podem haver várias promoções iguas, ex: 3 sanduiches com complemento de queijo junto com 3 sanudiches com adional de ovo
Agradeço antecipadamente por toda ajuda. |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Jul 31, 2018 2:39 pm Assunto: |
|
|
Boa tarde,
Não tenho nenhuma experiência com o MySQL, não sei se vou conseguir ajudar, mas você quer saber apenas se o movimento não tem os produtos da promoção?
Para que seja considerada a promoção é necessário que o produto e o complemento sejam diferentes? Ou pode ser um mesmo produto só que com complementos diferentes? Ou ainda produtos diferentes com um mesmo complemento?
Editado pela última vez por imex em Dom Fev 25, 2024 3:51 pm, num total de 1 vez |
|
| Voltar ao Topo |
|
 |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Ter Jul 31, 2018 2:55 pm Assunto: |
|
|
| imex escreveu: | Boa tarde,
Não tenho nenhuma experiência com o MySQL, não sei se vou conseguir ajudar, mas você quer saber apenas se o movimento não tem os produtos da promoção?
Para que seja considerada a promoção é necessário que o produto e o complemento sejam diferentes? Ou pode ser um mesmo produto só que com complementos diferentes? Ou ainda produtos diferentes com um mesmo complemento?
|
Para entrar na promoção tem q ser EXATAMENTE, como no exemplo acima, o sanduiche com o complemento de queijo + o sanduiche com o complemento de ovo, então preciso saber quando esse conjunto se encontra no movimento. |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Jul 31, 2018 3:37 pm Assunto: |
|
|
Experimente fazer uns testes com o esboço de query abaixo para ver se é obtido um resultado próximo do que você procura:
| Código: | select
m.Cod,
count(case when d.CodProd = 10 and c.CodProd = 11 then 1 end) as QtdCjA,
count(case when d.CodProd = 20 and c.CodProd = 21 then 1 end) as QtdCjB
from Movimento as m
inner join DetMovimento as d
on d.CodMov = m.Cod
inner join DetComplemento as c
on c.CodDetMov = d.Cod |
Espero que ajude |
|
| Voltar ao Topo |
|
 |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Ter Jul 31, 2018 5:23 pm Assunto: |
|
|
Na verdade eu preciso que a sql me mostra, numa única linha, o COD do detmovimento do primeiro produto + o COD do detcomplemento do primeiro produto + o COD do detmovimento do segundo produto + o COD do detcomplemento do segundo produto e se existirem duas promoções, teria que mostrar em linhas separadas.
| imex escreveu: | Experimente fazer uns testes com o esboço de query abaixo para ver se é obtido um resultado próximo do que você procura:
| Código: | select
m.Cod,
count(case when d.CodProd = 10 and c.CodProd = 11 then 1 end) as QtdCjA,
count(case when d.CodProd = 20 and c.CodProd = 21 then 1 end) as QtdCjB
from Movimento as m
inner join DetMovimento as d
on d.CodMov = m.Cod
inner join DetComplemento as c
on c.CodDetMov = d.Cod |
Espero que ajude |
|
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Jul 31, 2018 8:44 pm Assunto: |
|
|
Não sei se vai funcionar, mas tente fazer uns testes mais ou menos dessa forma:
| Código: | select
a.Cod,
a.CodDetMov as CodDetMovA,
a.CodDetComp as CodDetCompA,
b.CodDetMov as CodDetMovB,
b.CodDetComp as CodDetCompB
from
(
select
m.Cod,
d.Cod as CodDetMov,
c.Cod as CodDetComp,
@Linha:=case when @Cod = m.Cod then @Linha + 1 else 1 end as Linha,
@Cod:=m.Cod as Cod
from (SELECT @Cod:=0,@Linha:=0) as t, Movimento as m
inner join DetMovimento as d
on d.CodMov = m.Cod
inner join DetComplemento as c
on c.CodDetMov = d.Cod
where
d.CodProd = 10 and
c.CodProd = 11
) a
inner join
(
select
m.Cod,
d.Cod as CodDetMov,
c.Cod as CodDetComp,
@Linha:=case when @Cod = m.Cod then @Linha + 1 else 1 end as Linha,
@Cod:=m.Cod as Cod
from (SELECT @Cod:=0,@Linha:=0) as t, Movimento as m
inner join DetMovimento as d
on d.CodMov = m.Cod
inner join DetComplemento as c
on c.CodDetMov = d.Cod
where
d.CodProd = 20 and
c.CodProd = 21
) b
on b.Cod = a.Cod and b.Linha = a.Linha |
Espero que ajude |
|
| Voltar ao Topo |
|
 |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qua Ago 01, 2018 10:35 am Assunto: |
|
|
primeiramente ele gerou esse erro: Duplicate column name 'Cod'
analisando a SQL vi que em cada sql o COD se repete desse trechos:
m.Cod e @Cod:=m.Cod as Cod, alterei o segundo trecho para Cod2 e a sql passou mas não gerou nenhum registro, não sei se esse pequeno erro pode ter gerado algum problema.
| imex escreveu: | Não sei se vai funcionar, mas tente fazer uns testes mais ou menos dessa forma:
| Código: | select
a.Cod,
a.CodDetMov as CodDetMovA,
a.CodDetComp as CodDetCompA,
b.CodDetMov as CodDetMovB,
b.CodDetComp as CodDetCompB
from
(
select
m.Cod,
d.Cod as CodDetMov,
c.Cod as CodDetComp,
@Linha:=case when @Cod = m.Cod then @Linha + 1 else 1 end as Linha,
@Cod:=m.Cod as Cod
from (SELECT @Cod:=0,@Linha:=0) as t, Movimento as m
inner join DetMovimento as d
on d.CodMov = m.Cod
inner join DetComplemento as c
on c.CodDetMov = d.Cod
where
d.CodProd = 10 and
c.CodProd = 11
) a
inner join
(
select
m.Cod,
d.Cod as CodDetMov,
c.Cod as CodDetComp,
@Linha:=case when @Cod = m.Cod then @Linha + 1 else 1 end as Linha,
@Cod:=m.Cod as Cod
from (SELECT @Cod:=0,@Linha:=0) as t, Movimento as m
inner join DetMovimento as d
on d.CodMov = m.Cod
inner join DetComplemento as c
on c.CodDetMov = d.Cod
where
d.CodProd = 20 and
c.CodProd = 21
) b
on b.Cod = a.Cod and b.Linha = a.Linha |
Espero que ajude |
|
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Ago 01, 2018 11:52 am Assunto: |
|
|
Experimente fazer uns testes com essa versão:
| Código: | select
a.Cod,
a.CodDetMov as CodDetMovA,
a.CodDetComp as CodDetCompA,
b.CodDetMov as CodDetMovB,
b.CodDetComp as CodDetCompB
from
(
select
m.Cod,
d.Cod as CodDetMov,
c.Cod as CodDetComp,
@Linha:=case when @CodAntA = m.Cod then @Linha + 1 else 1 end as Linha,
@CodAntA:=m.Cod
from (SELECT @CodAntA:=0,@Linha:=0) as t, Movimento as m
inner join DetMovimento as d
on d.CodMov = m.Cod
inner join DetComplemento as c
on c.CodDetMov = d.Cod
where
d.CodProd = 10 and
c.CodProd = 11
) a
inner join
(
select
m.Cod,
d.Cod as CodDetMov,
c.Cod as CodDetComp,
@Linha:=case when @CodAntB = m.Cod then @Linha + 1 else 1 end as Linha,
@CodAntB:=m.Cod
from (SELECT @CodAntB:=0,@Linha:=0) as t, Movimento as m
inner join DetMovimento as d
on d.CodMov = m.Cod
inner join DetComplemento as c
on c.CodDetMov = d.Cod
where
d.CodProd = 20 and
c.CodProd = 21
) b
on b.Cod = a.Cod and b.Linha = a.Linha |
Espero que ajude |
|
| Voltar ao Topo |
|
 |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qua Ago 01, 2018 12:19 pm Assunto: |
|
|
vc é simplesmente o cara, MUITO obrigado mais uma vez meu amigo.
| imex escreveu: | Experimente fazer uns testes com essa versão:
| Código: | select
a.Cod,
a.CodDetMov as CodDetMovA,
a.CodDetComp as CodDetCompA,
b.CodDetMov as CodDetMovB,
b.CodDetComp as CodDetCompB
from
(
select
m.Cod,
d.Cod as CodDetMov,
c.Cod as CodDetComp,
@Linha:=case when @CodAntA = m.Cod then @Linha + 1 else 1 end as Linha,
@CodAntA:=m.Cod
from (SELECT @CodAntA:=0,@Linha:=0) as t, Movimento as m
inner join DetMovimento as d
on d.CodMov = m.Cod
inner join DetComplemento as c
on c.CodDetMov = d.Cod
where
d.CodProd = 10 and
c.CodProd = 11
) a
inner join
(
select
m.Cod,
d.Cod as CodDetMov,
c.Cod as CodDetComp,
@Linha:=case when @CodAntB = m.Cod then @Linha + 1 else 1 end as Linha,
@CodAntB:=m.Cod
from (SELECT @CodAntB:=0,@Linha:=0) as t, Movimento as m
inner join DetMovimento as d
on d.CodMov = m.Cod
inner join DetComplemento as c
on c.CodDetMov = d.Cod
where
d.CodProd = 20 and
c.CodProd = 21
) b
on b.Cod = a.Cod and b.Linha = a.Linha |
Espero que ajude |
|
|
| Voltar ao Topo |
|
 |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qui Ago 02, 2018 9:05 am Assunto: |
|
|
meu amigo, gostaria de somente mais uma ajuda para um detalhe q surgiu agora, a promoção só é válida se tiver 1 complemento, se tiver mais de um ela não é válida e dessa forma que está, se eu colocar 2 complementos ela entra.
| imex escreveu: | Experimente fazer uns testes com essa versão:
| Código: | select
a.Cod,
a.CodDetMov as CodDetMovA,
a.CodDetComp as CodDetCompA,
b.CodDetMov as CodDetMovB,
b.CodDetComp as CodDetCompB
from
(
select
m.Cod,
d.Cod as CodDetMov,
c.Cod as CodDetComp,
@Linha:=case when @CodAntA = m.Cod then @Linha + 1 else 1 end as Linha,
@CodAntA:=m.Cod
from (SELECT @CodAntA:=0,@Linha:=0) as t, Movimento as m
inner join DetMovimento as d
on d.CodMov = m.Cod
inner join DetComplemento as c
on c.CodDetMov = d.Cod
where
d.CodProd = 10 and
c.CodProd = 11
) a
inner join
(
select
m.Cod,
d.Cod as CodDetMov,
c.Cod as CodDetComp,
@Linha:=case when @CodAntB = m.Cod then @Linha + 1 else 1 end as Linha,
@CodAntB:=m.Cod
from (SELECT @CodAntB:=0,@Linha:=0) as t, Movimento as m
inner join DetMovimento as d
on d.CodMov = m.Cod
inner join DetComplemento as c
on c.CodDetMov = d.Cod
where
d.CodProd = 20 and
c.CodProd = 21
) b
on b.Cod = a.Cod and b.Linha = a.Linha |
Espero que ajude |
|
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Ago 02, 2018 11:32 am Assunto: |
|
|
Experimente adicionar um Not Exists conforme segue abaixo:
| Código: | from
(
select
m.Cod,
d.Cod as CodDetMov,
c.Cod as CodDetComp,
@Linha:=case when @CodAntA = m.Cod then @Linha + 1 else 1 end as Linha,
@CodAntA:=m.Cod
from (SELECT @CodAntA:=0,@Linha:=0) as t, Movimento as m
inner join DetMovimento as d
on d.CodMov = m.Cod
inner join DetComplemento as c
on c.CodDetMov = d.Cod
where
d.CodProd = 10 and
c.CodProd = 11 and
not exists
(select 1 from DetComplemento as c2
where
c2.CodDetMov = d.Cod and
c2.Cod <> c.Cod)
) a |
obs: o mesmo Not Exists deve ser adicionado na outra parte também
Espero que ajude |
|
| Voltar ao Topo |
|
 |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qui Ago 02, 2018 12:03 pm Assunto: |
|
|
PERFEITO meu amigo, funcionou, MUITO obrigado mais uma vez.
| imex escreveu: | Experimente adicionar um Not Exists conforme segue abaixo:
| Código: | from
(
select
m.Cod,
d.Cod as CodDetMov,
c.Cod as CodDetComp,
@Linha:=case when @CodAntA = m.Cod then @Linha + 1 else 1 end as Linha,
@CodAntA:=m.Cod
from (SELECT @CodAntA:=0,@Linha:=0) as t, Movimento as m
inner join DetMovimento as d
on d.CodMov = m.Cod
inner join DetComplemento as c
on c.CodDetMov = d.Cod
where
d.CodProd = 10 and
c.CodProd = 11 and
not exists
(select 1 from DetComplemento as c2
where
c2.CodDetMov = d.Cod and
c2.Cod <> c.Cod)
) a |
obs: o mesmo Not Exists deve ser adicionado na outra parte também
Espero que ajude |
|
|
| Voltar ao Topo |
|
 |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Seg Ago 06, 2018 11:27 am Assunto: |
|
|
Meu amigo, deixa eu lhe incomodar pela última vez, espero eu kkkk
Seguinte, depois de entrar na promoção, eu tenho q, caso o pedido seja alterado, verificar se o mesmo não SAIU da promoção (ele ter adicionado um segundo complemento, por exemplo) então eu teria q ter uma sql q verificasse se algum pedido, depois de ter entrado na promoção, saiu da promoção. para ajudar, existe um campo chamado PROMOCAO na tabela de detmovimento q eu alimento com um 'S' caso tenha entrado na promoção, então a SQL tem q ser baseada nesse campo caso seja 'S'.
| imex escreveu: | Experimente adicionar um Not Exists conforme segue abaixo:
| Código: | from
(
select
m.Cod,
d.Cod as CodDetMov,
c.Cod as CodDetComp,
@Linha:=case when @CodAntA = m.Cod then @Linha + 1 else 1 end as Linha,
@CodAntA:=m.Cod
from (SELECT @CodAntA:=0,@Linha:=0) as t, Movimento as m
inner join DetMovimento as d
on d.CodMov = m.Cod
inner join DetComplemento as c
on c.CodDetMov = d.Cod
where
d.CodProd = 10 and
c.CodProd = 11 and
not exists
(select 1 from DetComplemento as c2
where
c2.CodDetMov = d.Cod and
c2.Cod <> c.Cod)
) a |
obs: o mesmo Not Exists deve ser adicionado na outra parte também
Espero que ajude |
|
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Ago 06, 2018 3:49 pm Assunto: |
|
|
Quais alterações são possíveis na prática para que que um pedido/produto saia da promoção além de adicionar mais complementos? Um produto pode ser excluído? E um complemento?
O que você quer que a query retorne? Quais campos? O que saiu ou o que não saiu da promoção? |
|
| Voltar ao Topo |
|
 |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Seg Ago 06, 2018 4:41 pm Assunto: |
|
|
No caso de exclusão, em todas as situações, eu já tenho a solução, seria apenas a inclusão de um outro complemento. O que preciso q retorne são os mesmos campos q a query da promoção retorna.
| imex escreveu: | Quais alterações são possíveis na prática para que que um pedido/produto saia da promoção além de adicionar mais complementos? Um produto pode ser excluído? E um complemento?
O que você quer que a query retorne? Quais campos? O que saiu ou o que não saiu da promoção? |
|
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|