none
Obter informações diferentes a partir do mesmo parâmetro RRS feed

  • Pergunta

  • No código abaixo eu obtenho um resultado satisfatório, porém detectamos uma falha.

    SELECT t1.id_venda, t1.cpf_cliente, t6.cliente, t1.cpf_avalista, t7.avalista, t1.placa_venda, CONCAT(t3.marca, ' ', t4.modelo) AS veiculo_venda, t1.placa_troca, CONCAT(t3.marca, ' ', t4.modelo) AS veiculo_troca, t1.id_pagamento, t1.parcelas, t1.valor_vista, t1.valor_parcela, t1.valor_entrada
    FROM vendas AS t1
    INNER JOIN veiculos AS t2 ON t1.placa_venda = t2.placa
    INNER JOIN marcas AS t3 ON t2.id_marca = t3.id_marca
    INNER JOIN modelos AS t4 ON t2.id_modelo = t4.id_modelo
    INNER JOIN pagamentos AS t5 ON t1.id_pagamento = t5.id_pagamento
    INNER JOIN clientes AS t6 ON t1.cpf_cliente = t6.cpf_cliente
    LEFT OUTER JOIN avalistas AS t7 ON t1.cpf_avalista = t7.cpf_avalista
    WHERE t1.id_venda = 28
    LIMIT 1

    Percebam que o campo t1.placa_venda tem um valor e o t1.placa_troca outro valor.

    Na prática o cliente comprou um carro e deu o seu como parte na negociação.

    O SQL precisa me retornar entre outras informações o modelo dos dois carros que fica cadastrado em outras tabelas conforme relacionamento, porém, tanto o valor da coluna veiculo_venda quanto veiculo_troca recebem o mesmo valor vindo do primeiro campo.

    Tentei fazer um sub select mas não obtive sucesso, creio que fiz errado.



    terça-feira, 26 de maio de 2020 16:02

Respostas

  • Flávio,

    Eu havia pensando algo similar ao exemplo do Gapimex:

     -- Criando a CTEMav para trazer a Marca+Modelo de acordo com a venda --
     ;With CTEMav (MarcaModelo)
     As
     (
        SELECT CONCAT(mav.marca, ' ', mov.modelo) 
         FROM veiculos AS vv 
         INNER JOIN marcas AS mav ON vv.id_marca = mav.id_marca
         INNER JOIN modelos AS mov ON vv.id_modelo = mov.id_modelo
         WHERE t1.placa_venda = vv.placa
    )
    -- Criando a CTEMat para trazer a Marca+Modelo de acordo com a Matricula --
    ,CTEMat (MarcaModelo)    
    As
    (
        SELECT CONCAT(mat.marca, ' ', mot.modelo) 
         FROM veiculos AS vt 
         INNER JOIN marcas AS mat ON vt.id_marca = mat.id_marca
         INNER JOIN modelos AS mot ON vt.id_modelo = mot.id_modelo
         WHERE t1.placa_troca = vt.placa
    )
    SELECT 
        t1.id_venda, 
        t1.cpf_cliente, 
        t6.cliente, 
        t1.cpf_avalista, 
        t7.avalista, 
        t1.placa_venda, 
    	Veiculo_venda=(Select MarcaModelo From CTEMav),
        t1.placa_troca, 
    	Veiculo_troca=(Select MarcaModelo From CTEMat),
        t1.id_pagamento, 
        t1.parcelas, 
        t1.valor_vista,
        t1.valor_parcela, 
        t1.valor_entrada
    FROM vendas AS t1
    INNER JOIN pagamentos AS t5 ON t1.id_pagamento = t5.id_pagamento
    INNER JOIN clientes AS t6 ON t1.cpf_cliente = t6.cpf_cliente
    LEFT OUTER JOIN avalistas AS t7 ON t1.cpf_avalista = t7.cpf_avalista

    -- Não testei esta abordagem, por gentileza, verifique!!!!


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 27 de maio de 2020 23:08

Todas as Respostas

  • Boa tarde,

    Não entendi muito bem, pode colocar alguns exemplos do que vc precisa ?

    terça-feira, 26 de maio de 2020 17:19
  • Boa tarde,

    Não entendi muito bem, pode colocar alguns exemplos do que vc precisa ?

    Quando rodo o SQL acima o resultado é esse aqui:

    id_venda = 28
    cpf_cliente = 99999999999
    cliente = fulano
    cpf_avalista = 88888888888
    avalista = beltrano
    placa_venda = abc1234
    veiculo_venda = Palio
    placa_troca = def5678
    veiculo_troca = Palio
    id_pagamento = 4
    parcelas = 24
    valor_vista = 0.00
    valor_parcela = 820.00
    valor_entrada = 820.00

    Perceba que a coluna veiculo_troca é igual a veiculo_venda e não pode, pois placa_venda é diferente de placa_troca.

    Não estou conseguindo retornar o modelo do veículo dado na troca.

    terça-feira, 26 de maio de 2020 18:40
  • Boa tarde,

    Flávio, pelo que entendi da sua consulta é necessário um conjunto de junções para retornar os dados do veículo vendido e outro conjunto de junções para o veículo trocado. Segue sugestão para testes:

    SELECT 
        t1.id_venda, 
        t1.cpf_cliente, 
        t6.cliente, 
        t1.cpf_avalista, 
        t7.avalista, 
        t1.placa_venda, 
        CONCAT(mav.marca, ' ', mov.modelo) AS veiculo_venda, 
        t1.placa_troca, 
        CONCAT(mat.marca, ' ', mot.modelo) AS veiculo_troca, 
        t1.id_pagamento, 
        t1.parcelas, 
        t1.valor_vista,
        t1.valor_parcela, 
        t1.valor_entrada
    FROM vendas AS t1
    
    INNER JOIN veiculos AS vv ON t1.placa_venda = vv.placa
    INNER JOIN marcas AS mav ON vv.id_marca = mav.id_marca
    INNER JOIN modelos AS mov ON vv.id_modelo = mov.id_modelo
    
    INNER JOIN veiculos AS vt ON t1.placa_troca = vt.placa
    INNER JOIN marcas AS mat ON vt.id_marca = mat.id_marca
    INNER JOIN modelos AS mot ON vt.id_modelo = mot.id_modelo
    
    INNER JOIN pagamentos AS t5 ON t1.id_pagamento = t5.id_pagamento
    INNER JOIN clientes AS t6 ON t1.cpf_cliente = t6.cpf_cliente
    LEFT OUTER JOIN avalistas AS t7 ON t1.cpf_avalista = t7.cpf_avalista
    -- ...

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex terça-feira, 26 de maio de 2020 18:48
    terça-feira, 26 de maio de 2020 18:48
  • Flávio,

    Avalie que seu select está fazendo dois concat's com os mesmo campos:

    CONCAT(t3.marca, ' ', t4.modelo) AS veiculo_venda,
    CONCAT(t3.marca, ' ', t4.modelo) AS veiculo_troca
    Por isso está retornando informações "duplicadas", precisa especificar os campos corretos/tabelas.

    terça-feira, 26 de maio de 2020 18:55
  • Resultado em branco...
    terça-feira, 26 de maio de 2020 19:51
  • Se a coluna placa_venda ou a placa_troca podem ser nulas, experimente trocar o respectivo conjunto de junções de Inner Join para Left Join.

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 26 de maio de 2020 20:13
  • Com eu faço um sub select nessa sentença?
    terça-feira, 26 de maio de 2020 23:19
  • Segue uma sugestão para testes:

    SELECT 
        t1.id_venda, 
        t1.cpf_cliente, 
        t6.cliente, 
        t1.cpf_avalista, 
        t7.avalista, 
        t1.placa_venda, 
    
        (SELECT CONCAT(mav.marca, ' ', mov.modelo) 
         FROM veiculos AS vv 
         INNER JOIN marcas AS mav ON vv.id_marca = mav.id_marca
         INNER JOIN modelos AS mov ON vv.id_modelo = mov.id_modelo
         WHERE t1.placa_venda = vv.placa) AS veiculo_venda, 
    
        t1.placa_troca, 
    
        (SELECT CONCAT(mat.marca, ' ', mot.modelo) 
         FROM veiculos AS vt 
         INNER JOIN marcas AS mat ON vt.id_marca = mat.id_marca
         INNER JOIN modelos AS mot ON vt.id_modelo = mot.id_modelo
         WHERE t1.placa_troca = vt.placa) AS veiculo_troca, 
    
        t1.id_pagamento, 
        t1.parcelas, 
        t1.valor_vista,
        t1.valor_parcela, 
        t1.valor_entrada
    FROM vendas AS t1
    INNER JOIN pagamentos AS t5 ON t1.id_pagamento = t5.id_pagamento
    INNER JOIN clientes AS t6 ON t1.cpf_cliente = t6.cpf_cliente
    LEFT OUTER JOIN avalistas AS t7 ON t1.cpf_avalista = t7.cpf_avalista

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 27 de maio de 2020 12:35
  • Flávio,

    Eu havia pensando algo similar ao exemplo do Gapimex:

     -- Criando a CTEMav para trazer a Marca+Modelo de acordo com a venda --
     ;With CTEMav (MarcaModelo)
     As
     (
        SELECT CONCAT(mav.marca, ' ', mov.modelo) 
         FROM veiculos AS vv 
         INNER JOIN marcas AS mav ON vv.id_marca = mav.id_marca
         INNER JOIN modelos AS mov ON vv.id_modelo = mov.id_modelo
         WHERE t1.placa_venda = vv.placa
    )
    -- Criando a CTEMat para trazer a Marca+Modelo de acordo com a Matricula --
    ,CTEMat (MarcaModelo)    
    As
    (
        SELECT CONCAT(mat.marca, ' ', mot.modelo) 
         FROM veiculos AS vt 
         INNER JOIN marcas AS mat ON vt.id_marca = mat.id_marca
         INNER JOIN modelos AS mot ON vt.id_modelo = mot.id_modelo
         WHERE t1.placa_troca = vt.placa
    )
    SELECT 
        t1.id_venda, 
        t1.cpf_cliente, 
        t6.cliente, 
        t1.cpf_avalista, 
        t7.avalista, 
        t1.placa_venda, 
    	Veiculo_venda=(Select MarcaModelo From CTEMav),
        t1.placa_troca, 
    	Veiculo_troca=(Select MarcaModelo From CTEMat),
        t1.id_pagamento, 
        t1.parcelas, 
        t1.valor_vista,
        t1.valor_parcela, 
        t1.valor_entrada
    FROM vendas AS t1
    INNER JOIN pagamentos AS t5 ON t1.id_pagamento = t5.id_pagamento
    INNER JOIN clientes AS t6 ON t1.cpf_cliente = t6.cpf_cliente
    LEFT OUTER JOIN avalistas AS t7 ON t1.cpf_avalista = t7.cpf_avalista

    -- Não testei esta abordagem, por gentileza, verifique!!!!


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 27 de maio de 2020 23:08
  • Bingo. Exatamente o que precisava...
    quinta-feira, 4 de junho de 2020 16:15
  • Júnior quando roda apresenta um erro de coluna não identificada, no caso a Veiculo_venda
    quinta-feira, 4 de junho de 2020 16:20