Ir para conteúdo
annacaro

Query SQL - Joint Rows

Recommended Posts

Oi Pessoal, tudo bem? 

 

Tenho uma table no Mysql que guarda as formas de pagamento de cada venda realizada, porém são até 5 formas de pagamento que podem ser combinadas entre elas. 

No Mysql elas estão sendo gravadas em uma única table e para cada forma de pagamento utilizada é criada uma linha, sendo as colulas: entity_id / method_title/ payment_amount due_date /number_of_installments e value_of_the_installment. Veja exemplo:

 

Table com dados: webpos_order_payment

entity_id method_title payment_amount due_date number_of_installments value_of_the_installment
81 Entrada 341,3      
81 Boleto Bancário 3071,7 20/cada mês 11x U$ 279,25
81 Cartão de Crédito 2142 1 mes antes da viagem 5x U$ 428,00

 

Preciso fazer uma query que coloque todas essas formas de pagamento do mesmo entity_id em uma só linha. 

Consegui achar esse exemplo no fiddle (http://sqlfiddle.com/#!9/7ef46c/2/0) , e tentei adaptar, primeiro só testando 1 dos valores (payment_amount), mas está dando erro quando peço para executar. Alguém poderia me ajudar a entender o que eu fiz de errado para que eu possa finalizar o resto da query com os outros valores também? 

SELECT
    r0.entity_id, 
    r0.method_title, 
    r1.payment_amount AS "PA1",
    r2.payment_amount AS "PA2",
    r3.payment_amount AS "PA3"
   FROM
    (SELECT DISTINCT 
        entity_id, method_title
     FROM 
         order_payment
     ) r0
    LEFT JOIN results r1 
        ON r1.entity_id = r0.entity_id  AND r1.method_title = 'Entrada'
    LEFT JOIN results r2 
        ON r2.entity_id = r0.entity_id  AND r2.method_title = 'Boleto Bancário'
    LEFT JOIN results r3 
        ON r3.entity_id = r0.entity_id  AND r3.method_title = 'Cartão de Crédito'
ORDER BY
    r0.entity_id, r0.method_title ;

Mensagem de erro: 

Error executing query:
Select r0.entity_id, r0.method_title, r1.payment_amount As "PA1", r2.payment_amount As "PA2", r3.payment_amount As "PA3" From (Select Distinct entity_id, order_payment.method_title From order_payment) r0 Left Join results r1 On r1.entity_id = r0.entity_id And r1.method_title = 'Entrada' Left Join results r2 On r2.entity_id = r0.entity_id And r2.method_title = 'Boleto Bancário' Left Join results r3 On r3.entity_id = r0.entity_id And r3.method_title = 'Cartão de Crédito' Order By r0.entity_id, r0.method_title Limit 1000

 

Fico no aguardo da ajuda de vocês e já agradeço de antemão a ajuda. 

 

 

                       

Compartilhar este post


Link para o post
Compartilhar em outros sites
Citar

Preciso fazer uma query que coloque todas essas formas de pagamento do mesmo entity_id em uma só linha.  

 

 

Tentou com GROUP_CONCAT ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, obrigada por responder... 

Na verdade andei pesquisando sobre o group_concat e na verdade o resultado é diferente do que preciso. Preciso que as linhas se transformem em colunas e no group_concat seria criada apenas uma coluna com separação de pontuação. 

Ex: entity_id        coluna2

       81                  Entrada; 341,30; Boleto Bancário; 3071,7; 20/cada mes; 11x; 

 

Está correto isso sobre o group_concat? Alguma outra sugestão de query? 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Perroni91
      Olá pessoal.
      Estou com uma dúvida, mas como sou leiga no mysql, não estou conseguindo resolver.
       
      Tenho duas tabelas no meu banco de dados:
       
      Posts
      id
      titulo_principal
      categoria_id
      imagem
       
      Categorias
      id
      categoria
       
      ---

      Já cadastrei as categorias 'HTML' e 'CSS', e cada um contêm 1 post de cada.

      O que eu gostaria era que: A cada vez que criar um post em alguma dessas categorias, mostrar a quantidade separadamente.

      Ficaria assim:
      HTML               3
      CSS                   1


      Alguém poderia me ajudar, por favor?
      Estou quebrando a cabeça tentando fazer isso e não consegui.
      Obrigada!
    • Por danart5
      Bom dia! Estou fazendo um sistema de chamados, e na pagina onde o cliente envia para mim os dados do seu chamado, gostaria de trazer um aviso onde informasse o ID do chamado do mesmo.
      No banco de dados tem o campo id_ocorrencia, é auto incremente e assim que o usuário cadastra a ocorrência é cadastrado um id_ocorrencia.
      Segue o código :
       
       
      <div class="cadastro-form">         <?php             $nome_solicitante = $_POST['nome_solicitante'];             $ccusto = $_POST['ccusto'];             $equip = $_POST['equip'];             $tp_problema = $_POST['tipo_problema'];             $obs_informada = $_POST['obs_informada'];             $data_cadastro = date('Y-m-d');             $hora_cadastro = date('H:i:s');             //Conexão com o MySQL             $conn = mysql_connect('localhost','root','123456');             if (!$conn) {                 die('Could not connect: ' . mysql_error($conn));             }             mysql_select_db("osafti", $conn);             mysql_set_charset("utf8", $conn);             $sqli = mysql_query("INSERT INTO cadOcor (nome_solicitante, ccusto, equip, data_cadastro, hora_cadastro, tipo_problema, obs_informada, status) VALUES ('$nome_solicitante', '$ccusto', '$equip', '$data_cadastro', '$hora_cadastro', '$tp_problema', '$obs_informada', '0')", $conn) or die (mysql_error());             if ($sqli) {             ?>                            --------- NESSA REGIÃO É ONDE GOSTARIA DE TRAZER O ID DO CADASTRO FEITO A CIMA, É POSSÍVEL ?  ----                 <div class="alert alert-success" role="alert">                     Ocorrência cadastrada com sucesso!                  </div> <?php } else { ?> <div class="alert alert-danger" role="alert"> Erro ao cadastrar ocorrência. Tente novamente. Caso o erro persista entre em contato com o CPD. </div> <?php } mysql_close($conn); ?> </div>
    • Por gersonab
      há tempos utilizo para cadastrar data no BD a instrução :
      implode('-',array_reverse(explode('/',$data)))
      com isso no input posso colocar 09/02/2019 e no banco de dados grava 2019-02-09 , até ai sem problemas, porém ao atualizar um sistema para pdo, estou com problema no insert dinâmico, onde posso fazer 1 ou mais inserts, da forma abaixo cadastro quantos eu quiser :
      $sql = "INSERT INTO cantos ( id_t, id_c, data, ca, cant, po, des) VALUES (:id_t, :id_c, :data, :ca, :cant, :po, :des)";              $stmt = $pdo->prepare($sql);             foreach($_POST['idp'] as $indice => $valor) {             $stmt->bindParam(':id_t', $_POST['id_tor'][$indice], PDO::PARAM_STR);             $stmt->bindParam(':id_c', $_POST['idp'][$indice], PDO::PARAM_STR);             $stmt->bindParam(':data', $_POST['data'][$indice], PDO::PARAM_STR);             $stmt->bindParam(':ca', $_POST["ca"][$indice], PDO::PARAM_STR);             $stmt->bindParam(':cant', $_POST['cant'][$indice], PDO::PARAM_STR);             $stmt->bindParam(':po', $_POST['po'][$indice], PDO::PARAM_STR);             $stmt->bindParam(':des', $_POST['des'][$indice], PDO::PARAM_STR);                              if ($stmt->execute()){                     echo "Cadastrado com sucesso.";             }
      no entento a data vai no formato do input 09/02/2019.
      caso utilize :
      $stmt->bindParam(':data', implode('-',array_reverse(explode('/',$_POST['data'][$indice]))), PDO::PARAM_STR);
      tenho o erro Strict standards: "Only variables should be passed by reference in "que significa "Apenas as variáveis podem ser passadas por referência"
      qual a melhor forma de se fazer neste caso ?
    • Por lendadomato
      Pessoal,

      tenho alguns bancos de dados mysql e em servidores diferentes, o problema é que de um tempo
      pra cá ao inserir dados que tenham sinal de + nos campo tipo varchar, ele simplesmente ignora o sinal.
      Tenho aplicativos que os administradores cadastram combo de pizzas no exemplo:
      - Combo pizza Grande + Refri + borda catupiry

      Agora parece que alterou algo no banco que não é possível cadastrar mais com o sinal de + ficando assim:
      - Combo pizza Grande    Refri    borda catupiry
       
      O sistema substitui o sinal de + por dois espaços.
      Alguém sabe o que está acontecendo?
      Não fiz nenhum alteração no sistema que há muito tempo funcionava perfeitamente.
    • Por AllysonSouza
      Boa noite pessoal, passei dia todo batendo a cabeca e ainda nao descobri como fazer para o autocomplete listar o id em outro input, quero que depois do autocomplete enviar, ele envie apenas o ID da RUA, eu consigo puxar o id junto com o nome da rua no mesmo campo imput, porem queria que o id fosse para outro campo input para eu enviar para o banco de dados, bom segue o codigo:
      index.php
      <?php session_start(); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>jQuery Autocomplete Plugin</title> <script type="text/javascript" src="js/jquery-1.4.2.js"></script> <script type='text/javascript' src="js/jquery.autocomplete.js"></script> <link rel="stylesheet" type="text/css" href="js/jquery.autocomplete.css" /> <script type="text/javascript"> $().ready(function() { $("#course").autocomplete("autoComplete.php", { width: 260, matchContains: true, //mustMatch: true, //minChars: 0, //multiple: true, //highlight: false, //multipleSeparator: ",", selectFirst: false }); }); </script> </head> <body> <div id="content" > <form autocomplete="off"> <p> Digite a rua : <input type="text" name="course" id="course" /> </p> </form> </div> </body> </html> autocomplete.php
      <?php include "conexao.php"; $q = strtolower($_GET["q"]); if (!$q) return; $sql = "select DISTINCT id, nome from ruas where nome LIKE '%$q%'"; $rsd = mysqli_query($con, $sql); while($rs = mysqli_fetch_array($rsd)) { $cid = $rs['id']; $cnome = $rs['nome']; echo "$cid $cnome\n "; } ?>  
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.