Ir para conteúdo
janir.matheus

Ajuda com query mysql

Recommended Posts

Boa noite, preciso de ajuda pois não seu por onde começar:

 

Partindo dessas 3 tabelas:

Tabela 1:

CREATE TABLE `tbl_cat_estoque` (
	`Cod` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Atenção ao campo CHAR',
	`Transacao` VARCHAR(100) NOT NULL,
	`Descricao` TEXT NOT NULL,
	PRIMARY KEY (`Cod`),
	UNIQUE INDEX `Matricula` (`Transacao`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=2
;

Tabela 2:

CREATE TABLE `tbl_estoque` (
	`Cod` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
	`Dia` DATE NOT NULL,
	`Filial` INT(10) UNSIGNED NOT NULL,
	`Transacao` INT(10) UNSIGNED NOT NULL,
	`Produto` INT(10) UNSIGNED NOT NULL,
	`Cliente_Fornecedor` INT(10) UNSIGNED NOT NULL,
	`Descricao` VARCHAR(100) NULL DEFAULT NULL,
	`Quantidade` INT(11) NOT NULL,
	`Validade` DATE NULL DEFAULT NULL,
	`Efetivado` ENUM('S','N') NOT NULL,
	`N_Controle` INT(11) NULL DEFAULT NULL,
	PRIMARY KEY (`Cod`),
	UNIQUE INDEX `N_Controle` (`N_Controle`),
	INDEX `FK_Produto` (`Produto`),
	INDEX `FK2_Trans_Estoque` (`Transacao`),
	INDEX `FK_Contatos` (`Cliente_Fornecedor`),
	INDEX `FK4_Filial` (`Filial`),
	CONSTRAINT `FK2_Trans_Estoque` FOREIGN KEY (`Transacao`) REFERENCES `tbl_cat_estoque` (`Cod`),
	CONSTRAINT `FK_Produto` FOREIGN KEY (`Produto`) REFERENCES `tbl_produtos` (`Cod`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=758
;

Tabela 3:

CREATE TABLE `tbl_produtos` (
	`Cod` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`Produto` VARCHAR(250) NOT NULL,
	`Preco_Custo` FLOAT(10,2) NOT NULL,
	`Fornecedor` INT(10) UNSIGNED NOT NULL,
	`Grupo` INT(10) UNSIGNED NOT NULL,
	`Informacoes` TEXT NULL,
	`Preco` DECIMAL(10,2) NOT NULL,
	`Esgotado` ENUM('S','N') NOT NULL DEFAULT 'N',
	PRIMARY KEY (`Cod`),
	UNIQUE INDEX `Produto` (`Produto`),
	INDEX `FK_fornecedor` (`Fornecedor`),
	INDEX `FK2_Grupo` (`Grupo`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=163
;

Preciso de uma query que retorne todos os produtos cadastrados e suas respectivas quantidades em estoque. Sendo que o campo "Transacao' presente em tbl_estoque e quem diferencia uma entrada de uma saída de mercadorias. - Meus conhecimentos me levaram até aqui:

SELECT 
	tbl_estoque.Produto AS Cod_Produto,
	tbl_produtos.Produto AS Produto,
	tbl_cat_estoque.Transacao AS Transacao,
	(case when (tbl_cat_estoque.Transacao like '1%') then sum(tbl_estoque.Quantidade) else 0 end) AS Entradas,
	(case when (tbl_cat_estoque.Transacao LIKE '2%') then sum(tbl_estoque.Quantidade) else 0 end) AS Saidas	
from tbl_estoque 
join tbl_cat_estoque ON (tbl_estoque.Transacao = tbl_cat_estoque.Cod)
JOIN tbl_produtos ON (tbl_estoque.Produto = tbl_produtos.Cod)
group by tbl_estoque.Transacao;

Agradeço toda ajuda que receber.

Compartilhar este post


Link para o post
Compartilhar em outros sites
10 horas atrás, janir.matheus disse:

Preciso de uma query que retorne todos os produtos cadastrados e suas respectivas quantidades em estoque. Sendo que o campo "Transacao' presente em tbl_estoque e quem diferencia uma entrada de uma saída de mercadorias. - Meus conhecimentos me levaram até aqui:

 

Sem mais, segue código:

 

SQLs A SER UTILIZADAS

CREATE TABLE `tbl_cat_estoque` (
	`Cod` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Atenção ao campo CHAR',
	`Transacao` VARCHAR(100) NOT NULL,
	`Descricao` TEXT NOT NULL,
	PRIMARY KEY (`Cod`),
	UNIQUE INDEX `Matricula` (`Transacao`)
);
INSERT INTO tbl_cat_estoque ( Transacao, Descricao ) VALUES
( '1', 'Descricao 1' ),
( '2', 'Descricao 2' );

CREATE TABLE `tbl_produtos` (
	`Cod` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`Produto` VARCHAR(250) NOT NULL,
	`Preco_Custo` FLOAT(10,2) NOT NULL,
	`Fornecedor` INT(10) UNSIGNED NOT NULL,
	`Grupo` INT(10) UNSIGNED NOT NULL,
	`Informacoes` TEXT NULL,
	`Preco` DECIMAL(10,2) NOT NULL,
	`Esgotado` ENUM('S','N') NOT NULL DEFAULT 'N',
	PRIMARY KEY (`Cod`),
	UNIQUE INDEX `Produto` (`Produto`),
	INDEX `FK_fornecedor` (`Fornecedor`),
	INDEX `FK2_Grupo` (`Grupo`)
);
INSERT INTO tbl_produtos ( Produto, Preco_Custo, Fornecedor, Grupo, Informacoes, Preco ) VALUES
( 'Televisor', 3000, 1, 1, 'Televisor HD', 4000 ),
( 'Radio', 1000, 2, 2, 'Radio HD', 2000 ),
( 'Radio a Pilha', 4000, 2, 2, 'Radio a Pilha HD', 5000 ),
( 'Celular', 6000, 3, 3, 'Celular HD', 7000 );

CREATE TABLE `tbl_estoque` (
	`Cod` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
	`Dia` DATE NOT NULL,
	`Filial` INT(10) UNSIGNED NOT NULL,
	`Transacao` INT(10) UNSIGNED NOT NULL,
	`Produto` INT(10) UNSIGNED NOT NULL,
	`Cliente_Fornecedor` INT(10) UNSIGNED NOT NULL,
	`Descricao` VARCHAR(100) NULL DEFAULT NULL,
	`Quantidade` INT(11) NOT NULL,
	`Validade` DATE NULL DEFAULT NULL,
	`Efetivado` ENUM('S','N') NOT NULL,
	`N_Controle` INT(11) NULL DEFAULT NULL,
	PRIMARY KEY (`Cod`),
	UNIQUE INDEX `N_Controle` (`N_Controle`),
	INDEX `FK_Produto` (`Produto`),
	INDEX `FK2_Trans_Estoque` (`Transacao`),
	INDEX `FK_Contatos` (`Cliente_Fornecedor`),
	INDEX `FK4_Filial` (`Filial`),
	CONSTRAINT `FK2_Trans_Estoque` FOREIGN KEY (`Transacao`) REFERENCES `tbl_cat_estoque` (`Cod`),
	CONSTRAINT `FK_Produto` FOREIGN KEY (`Produto`) REFERENCES `tbl_produtos` (`Cod`)
);
INSERT INTO tbl_estoque ( Dia, Filial, Transacao, Produto, Cliente_Fornecedor, Descricao, Quantidade, Validade, Efetivado, N_Controle ) VALUES
( '2017-03-18', 1, 1, 1, 1, 'Algo', 10, NULL, 'S', 1112 ),
( '2017-04-28', 1, 2, 2, 2, 'Algo', 20, NULL, 'N', 1200 ),
( '2017-04-30', 1, 2, 3, 2, 'Algo', 30, NULL, 'N', 1331 ),
( '2018-04-20', 1, 1, 4, 3, 'Algo', 40, NULL, 'S', 2122 ),
( '2017-04-30', 1, 2, 3, 2, 'Algo', 30, NULL, 'N', 1332 ),
( '2017-03-18', 1, 1, 1, 1, 'Algo', 10, NULL, 'S', 1113 );


QUERY

SELECT
	tbl_estoque.Produto AS Cod_Produto,
	tbl_produtos.Produto AS Produto,
	tbl_cat_estoque.Transacao AS Transacao,
	(CASE WHEN (tbl_cat_estoque.Transacao LIKE '1%') THEN SUM(tbl_estoque.Quantidade) ELSE 0 END) AS Entradas,
	(CASE WHEN (tbl_cat_estoque.Transacao LIKE '2%') THEN SUM(tbl_estoque.Quantidade) ELSE 0 END) AS Saidas
FROM
	tbl_estoque
JOIN
	tbl_cat_estoque
ON
	(tbl_estoque.Transacao = tbl_cat_estoque.Cod)
JOIN
	tbl_produtos
ON
	(tbl_estoque.Produto = tbl_produtos.Cod)
GROUP BY
	tbl_estoque.Produto


RESULTADO

image.png.49abe9bd5724ac524e162caef0940935.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gostaria de adicionar uma coluna calculada baseada no seguinte código

SELECT
	tbl_estoque.Produto AS Cod_Produto,
	tbl_produtos.Produto AS Produto,
	tbl_estoque.Transacao AS Cod_Transacao,
	tbl_cat_estoque.Transacao AS Transacao,
	(CASE WHEN (tbl_cat_estoque.Transacao LIKE '1%') THEN SUM(tbl_estoque.Quantidade) ELSE 0 END) AS Entradas,
	(CASE WHEN (tbl_cat_estoque.Transacao LIKE '2%') THEN SUM(tbl_estoque.Quantidade) ELSE 0 END) AS Saidas,
    /*--------------------------------------------------------------------------------*/
	(SELECT Entradas-Saidas) AS Saldo /*estou tendo problemas aqui*/
    /*--------------------------------------------------------------------------------*/
FROM
	tbl_estoque
JOIN tbl_cat_estoque ON (tbl_estoque.Transacao = tbl_cat_estoque.Cod)
JOIN tbl_produtos ON (tbl_estoque.Produto = tbl_produtos.Cod)
GROUP BY tbl_estoque.Produto;

Como resolver? Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

SELECT
	tbl_estoque.Produto AS Cod_Produto,
	tbl_produtos.Produto AS Produto,
	tbl_estoque.Transacao AS Cod_Transacao,
	tbl_cat_estoque.Transacao AS Transacao,
	(CASE WHEN (tbl_cat_estoque.Transacao LIKE '1%') THEN SUM(tbl_estoque.Quantidade) ELSE 0 END) AS Entradas,
	(CASE WHEN (tbl_cat_estoque.Transacao LIKE '2%') THEN SUM(tbl_estoque.Quantidade) ELSE 0 END) AS Saidas,
    /*------------------------deve resolver--------------------------------------------------------*/
	( (CASE WHEN (tbl_cat_estoque.Transacao LIKE '1%') THEN SUM(tbl_estoque.Quantidade) ELSE 0 END) -
	  (CASE WHEN (tbl_cat_estoque.Transacao LIKE '2%') THEN SUM(tbl_estoque.Quantidade) ELSE 0 END) ) as total
    /*--------------------------------------------------------------------------------*/
FROM
	tbl_estoque
JOIN tbl_cat_estoque ON (tbl_estoque.Transacao = tbl_cat_estoque.Cod)
JOIN tbl_produtos ON (tbl_estoque.Produto = tbl_produtos.Cod)
GROUP BY tbl_estoque.Produto;

Compartilhar este post


Link para o post
Compartilhar em outros sites

O resultado está errado. A seguinte query soma todas as entradas na tabela estoque como saída.

SELECT
	tbl_estoque.Produto AS Cod_Produto,
	tbl_produtos.Produto AS Produto,
	tbl_estoque.Transacao AS Cod_Transacao,
	tbl_cat_estoque.Transacao AS Transacao,
	(CASE WHEN (tbl_cat_estoque.Transacao LIKE '1%') THEN SUM(tbl_estoque.Quantidade) ELSE 0 END) AS Entradas,
	(CASE WHEN (tbl_cat_estoque.Transacao LIKE '2%') THEN SUM(tbl_estoque.Quantidade) ELSE 0 END) AS Saidas,
	( 
		(CASE WHEN (tbl_cat_estoque.Transacao LIKE '1%') THEN SUM(tbl_estoque.Quantidade) ELSE 0 END) -
	  	(CASE WHEN (tbl_cat_estoque.Transacao LIKE '2%') THEN SUM(tbl_estoque.Quantidade) ELSE 0 END) 
	) as Saldo
FROM
	tbl_estoque
JOIN tbl_cat_estoque ON (tbl_estoque.Transacao = tbl_cat_estoque.Cod)
JOIN tbl_produtos ON (tbl_estoque.Produto = tbl_produtos.Cod)
GROUP BY tbl_estoque.Produto;

Abaixo o print do resultado obtido:

 

post-forum.jpg

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 WebCorplfs
      Pessoal, bom dia,.. por gentileza alguem pode me dar uma ajuda:
      Preciso montar uma consulta que funcione da seguinte forma:
      SELECT distinct hora_ponto, data, pis FROM conferencia_ponto where pis = '013025727232' and data = '2017/01/30' que traz o seguinte resultado:
      hora_ponto   data     pis 07:40:00          30/01/2017 00:00:00       013025727232 10:59:00 30/01/2017 00:00:00 013025727232 12:56:00 30/01/2017 00:00:00 013025727232 17:25:00 30/01/2017 00:00:00 013025727232 * hora ponto é um campo que estou importando de um txt de relogio de ponto
      E outra  query com a seguinte estrutura e resultado :
      SELECT b.horario, a.data, a.pis FROM escala_individual as a, cadastro_horario_itens as b, cadastro_horarios as c where a.evento = b.codigo_horario and b.codigo_horario = c.codigo AND a.pis = '013025727232' and a.data = '2017/01/31' group by data, horario horario  data pis 07:30:00        31/01/2017 00:00:00       013025727232 12:00:00 31/01/2017 00:00:00 013025727232 13:00:00 31/01/2017 00:00:00 013025727232 17:00:00 31/01/2017 00:00:00 013025727232 * horario é o campo que parametrizei com as tabelas cadastro_horarios x cadastro_horario_itens, ou seja, sao horarios de trabalho pre definidos.
      nao consegui ate o momento montar uma query que me apresentasse da seguinte forma:
      horario hora_ponto         data pis 07:30:00      07:40:00        31/01/2017 00:00      13025727232 12:00:00 10:59:00        31/01/2017 00:00 13025727232 13:00:00 12:56:00        31/01/2017 00:00 13025727232 17:00:00 17:25:00        31/01/2017 00:00 13025727232 O problema que estou tendo é que ao trazer os registros com um join e as devidas clausulas where ele repete alguns valores devido a quantidade de registros na tabela cadsatro_horario_itens... nao sei se fui claro...
      alguem pode me ajudar?
×

Informação importante

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