Ir para conteúdo
rcamu

Select duplicando as linhas

Recommended Posts

Tenho o select abaixo, só que ele está trazendo duas linhas para o mesmo produto, ele traz uma linha para o d.tipo      = '0' e outra para o  d.tipo      = '1', preciso que na mesma linha mostre os 2.

 

Onde estou errando?

 

SELECT STRAIGHT_JOIN      DISTINCT TMP.*
FROM        (
                SELECT      DISTINCT d.cat_id   AS prod
                        ,   p.id
                        ,   p.nome              AS id_prod
                        ,   SUM(d.qtd)          AS qtd_prod
                        ,   SUM(d.valor_total)  AS total_prod
                        ,   SUM(0)              AS qtd_estoque
                FROM        lc_controle c
                INNER JOIN  lc_detalhe  d ON d.controle_id  = c.id
                INNER JOIN  lc_cat      p ON p.id           = d.cat_id
                WHERE       d.tipo      = '0'
                        AND c.dtConcat  BETWEEN '2018-05-01' AND '2018-08-05'
                        AND c.exportado = 'Sim'
                GROUP BY    prod
                UNION all
                SELECT STRAIGHT_JOIN     DISTINCT d.cat_id   AS prod
                        ,   p.id
                        ,   p.nome              AS id_prod
                        ,   SUM(0)              AS qtd_prod
                        ,   SUM(0)              AS total_prod
                        ,   SUM(d.qtd)          AS qtd_estoque
                FROM        lc_controle c
                INNER JOIN  lc_detalhe  d ON d.controle_id  = c.id
                INNER JOIN  lc_cat      p ON p.id           = d.cat_id
                WHERE       d.tipo      = '1'
                        AND c.dtConcat  < '2018-08-05'
                        AND c.exportado = 'Sim'
                GROUP BY    prod
            ) TMP
ORDER BY    TMP.qtd_prod DESC

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

da erro, poderia me dizer como usar por favor?

 

Fiz assim e da erro:

 

SELECT  DISTINCT TMP.*
FROM        (
                GROUP_CONCAT( SELECT DISTINCT d.cat_id   AS prod)
                ,   p.id
                        ,   p.nome              AS id_prod
                        ,   SUM(d.qtd)          AS qtd_prod
                        ,   SUM(d.valor_total)  AS total_prod
                        ,   SUM(0)              AS qtd_estoque
                FROM        lc_controle c
                INNER JOIN  lc_detalhe  d ON d.controle_id  = c.id
                INNER JOIN  lc_cat      p ON p.id           = d.cat_id
                WHERE       d.tipo      = '0'
                        AND c.dtConcat  BETWEEN '2018-05-01' AND '2018-08-05'
                        AND c.exportado = 'Sim'
                group by prod, id_prod
                UNION
               GROUP_CONCAT( SELECT DISTINCT d.cat_id   AS prod)
                        ,   p.id
                        ,   p.nome              AS id_prod
                        ,   SUM(0)              AS qtd_prod
                        ,   SUM(0)              AS total_prod
                        ,   SUM(d.qtd)          AS qtd_estoque
                FROM        lc_controle c
                INNER JOIN  lc_detalhe  d ON d.controle_id  = c.id
                INNER JOIN  lc_cat      p ON p.id           = d.cat_id
                WHERE       d.tipo      = '1'
                        AND c.dtConcat  < '2018-08-05'
                        AND c.exportado = 'Sim'
                group by prod, id_prod
            ) TMP 
ORDER BY    TMP.qtd_prod DESC

e desse outro modo ele continua com os resultados duplicados.

 

SELECT  DISTINCT TMP.*
FROM        (
                SELECT GROUP_CONCAT( DISTINCT d.cat_id)
                ,   p.id
                        ,   p.nome              AS id_prod
                        ,   SUM(d.qtd)          AS qtd_prod
                        ,   SUM(d.valor_total)  AS total_prod
                        ,   SUM(0)              AS qtd_estoque
     
                FROM        lc_controle c
                INNER JOIN  lc_detalhe  d ON d.controle_id  = c.id
                INNER JOIN  lc_cat      p ON p.id           = d.cat_id
                WHERE       d.tipo      = '0'
                        AND c.dtConcat  BETWEEN '2018-05-01' AND '2018-08-05'
                        AND c.exportado = 'Sim'
                group by d.cat_id
                UNION
               SELECT GROUP_CONCAT( DISTINCT d.cat_id)
                        ,   p.id
                        ,   p.nome              AS id_prod
                        ,   SUM(0)              AS qtd_prod
                        ,   SUM(0)              AS total_prod
                        ,   SUM(d.qtd)          AS qtd_estoque
                FROM        lc_controle c
                INNER JOIN  lc_detalhe  d ON d.controle_id  = c.id
                INNER JOIN  lc_cat      p ON p.id           = d.cat_id
                WHERE       d.tipo      = '1'
                        AND c.dtConcat  < '2018-08-05'
                        AND c.exportado = 'Sim'
                group by d.cat_id
            ) TMP 
ORDER BY    TMP.qtd_prod DESC

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio ser isto 

 

SELECT STRAIGHT_JOIN   prod,id_prod,ID,qtd_prod,total_prod,qtd_estoque,
                       GROUP_CONCAT(DISTINCT TIPO
                      ORDER BY TIPO DESC SEPARATOR ' ') TIPOS
FROM        (
                SELECT      DISTINCT d.cat_id   AS prod
                        ,   p.id
                        ,   p.nome              AS id_prod
                        ,   d.tipo              AS TIPO
                        ,   SUM(d.qtd)          AS qtd_prod
                        ,   SUM(d.valor_total)  AS total_prod
                        ,   SUM(0)              AS qtd_estoque
                FROM        lc_controle c
                INNER JOIN  lc_detalhe  d ON d.controle_id  = c.id
                INNER JOIN  lc_cat      p ON p.id           = d.cat_id
                WHERE       d.tipo      = '0'
                        AND c.dtConcat  BETWEEN '2018-05-01' AND '2018-08-05'
                        AND c.exportado = 'Sim'
                GROUP BY    prod
                UNION all
                SELECT STRAIGHT_JOIN     DISTINCT d.cat_id   AS prod
                        ,   p.id
                        ,   p.nome              AS id_prod
                        ,   d.tipo              AS TIPO
                        ,   SUM(0)              AS qtd_prod
                        ,   SUM(0)              AS total_prod
                        ,   SUM(d.qtd)          AS qtd_estoque
                FROM        lc_controle c
                INNER JOIN  lc_detalhe  d ON d.controle_id  = c.id
                INNER JOIN  lc_cat      p ON p.id           = d.cat_id
                WHERE       d.tipo      = '1'
                        AND c.dtConcat  < '2018-08-05'
                        AND c.exportado = 'Sim'
                GROUP BY    prod
            ) TMP
ORDER BY    TMP.qtd_prod DESC

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendo , sem a base fica difícil.

 

Mas a síntaxe do group e colocá-lo numa linha

 

Como as " quantidades incorretas" eradas vieram ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ele retornou apenas 1 produto e a qtd veio apenas do tipo 0, como poderia te passar as bases?

 

prod id_prod ID qtd_prod total_prod qtd_estoque TIPOS  
24 HJ-111B FILTRO INTERNO 200LH 127V   24 87 1709.40 0 1 0
 
 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema são os totalizadores , else ficam incompatíveis 9em tese) com o agrupamento em linha

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 Victor Cometti
      Boa noite,
       
      Em algumas de minhas queries de insert eu atualizo quando encontro registro duplicado.
      insert into .... ON DUPLICATE KEY UPDATE ...... Só que descobrir que além de verificar a PRIMARY KEY ele verifica também campos UNIQUE (um ou outro).
      O interessante para mim seria que fizesse update só quando achasse a PRIMARY KEY duplicada e não o campo UNIQUE.
      É possível sem procedure? 
       
    • Por dungol
      Ola Pessoal,
      Comprei um script em php e Mysql e estou precisando de uma ajuda.
      É um script POS simples de vendas. Quando eu faço uma venda o recibo sai apenas o nome do cliente, o telefone e as informaçoes da compra, mas eu gostaria de adicionar neste recibo o endereço do cliente. Na tabela de compra já tem o campo endereço, mas eu não sei como fazer o script adicionar o endereço do cliente nessa  tabela. 
      Obrigada pela ajuda,
      Cristina
    • Por UPeralta
      Olá, preciso de ajuda. A minha função de fetch_object está acessando apenas a primeira linha do resultado da SELECT, mas a seleção está retornando duas linhas. Não sei o que eu estou fazendo errado.
      Class que está fazendo a consulta no banco de dados:
      <?php class permissao_grupo { //Variáveis referentes a colunas public $peg_codigo; public $peg_nome; //Variáveis padrão das classes public $con; public $sql; public $result; //Funções padrão para todas as classes public function __construct() { $this->con = new Conexao(); } public function fetch_object() { $this->result = $this->result->fetch_object(); foreach ($this->result AS $chave => $valor) { $this->$chave = $valor; } } public function num_rows() { return $this->result->num_rows; } //Funções da classe public function montaGrupoMenu() { $sql = "SELECT peg_codigo, peg_nome FROM permissao_grupo "; $this->result = $this->con->Executar($sql); return $this->result; } }  
      Class conexão
      <?php class Conexao { public $host = "localhost"; public $usuario = "root"; public $senha = ""; public $banco = "smart"; public $mysqli; public function __construct() { $this->Abrir(); } public function Abrir() { $this->mysqli = new mysqli(); $this->mysqli->connect($this->host, $this->usuario, $this->senha, $this->banco); } public function Fechar() { $mysqli->close(); } public function Executar($sql){ return $this->mysqli->query($sql); } public function fetch_object(){ print_r($this->mysqli->fetch_assoc()); } }  
      Alguém poderia me ajudar? Já tentei usar o fetch_assoc e o fetch_array para ver se funcionaria, mas também não deu certo.
    • Por Lucasw
      E aí pessoal, estou com um problema que me afrontou essa madrugada toda.
      Estou tentando duplicar valores de dentro de outro valor, porém na hora
      de duplicar eu não tenho conhecimento para um comando que crie novos IDS
      então, está dando erro a horas e eu em busca da solução.
      Podem me ajudar?
       
      INSERT INTO items_rooms (id, room_id, user_id)
      SELECT id, 15602, user_id
      FROM items_rooms WHERE room_id = '15601';
       
      (é onde está negrito que está o problema.)
       
      Bom dia a todos!
       
      CREATE TABLE `items_rooms` (
          `id` VARCHAR(23) NOT NULL,
          `user_id` INT(10) NOT NULL,
    • Por Marcones Borges
      Bom dia, esto tentando inserir dados de um formulário em duas tabelas ao mesmo tempo.
       
      Gostaria de sua ajuda!
       
      Arquivo Insere
       

      $conexao = conexao::getInstance();         // Recebe os dados enviados pela submissão         $acao  = (isset($_POST['acao'])) ? $_POST['acao'] : '';         $id    = (isset($_POST['id'])) ? $_POST['id'] : '';         $nome  = (isset($_POST['nome'])) ? $_POST['nome'] : '';         $funcao = (isset($_POST['funcao'])) ? $_POST['funcao'] : '';         $cpf   = (isset($_POST['cpf'])) ? str_replace(array('.','-'), '', $_POST['cpf']): '';         $status           = (isset($_POST['status'])) ? $_POST['status'] : '';   $sql = 'INSERT INTO historico (registro_ministro, descricao, data_registro, usuario )                VALUES(:registro_ministro, :descricao, :data_registro, :usuario )';                  $stm = $conexao->prepare($sql);             $stm->bindValue(':registro_ministro', $registro_ministro);             $stm->bindValue(':descricao', $descricao);             $stm->bindValue(':data_registro', $data_registro);             $stm->bindValue(':usuario', $usuario);             $retorno = $stm->execute();                          if ($retorno):                 echo "<div class='alert alert-success' role='alert'>Registro editado com sucesso, aguarde você está sendo redirecionado ...</div> ";             else:                 echo "<div class='alert alert-danger' role='alert'>Erro ao editar registro!</div> ";             endif;             echo "<meta http-equiv=refresh content='0;URL=ministros.php'>";         endif; $sql = 'INSERT INTO ministro (nome, cpf,  funcao, status )                VALUES(:nome, :cpf, :rg,  :funcao, :status, )';                                $stm = $conexao->prepare($sql);             $stm->bindValue(':nome', $nome);             $stm->bindValue(':cpf', $cpf);             $stm->bindValue(':status', $status);             $stm->bindValue(':funcao', $funcao);
       
      Porém só executa o ultimo código não executa o primeiro o que pode ser ?
       
×

Informação importante

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