ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Dúvida SQL (MySQL)
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Ter Jul 31, 2018 1:45 pm    Assunto: Dúvida SQL (MySQL) Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Jul 31, 2018 2:39 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Ter Jul 31, 2018 2:55 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Jul 31, 2018 3:37 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Ter Jul 31, 2018 5:23 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Jul 31, 2018 8:44 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Qua Ago 01, 2018 10:35 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Ago 01, 2018 11:52 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Qua Ago 01, 2018 12:19 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Qui Ago 02, 2018 9:05 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Ago 02, 2018 11:32 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Qui Ago 02, 2018 12:03 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Seg Ago 06, 2018 11:27 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Seg Ago 06, 2018 3:49 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Seg Ago 06, 2018 4:41 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB