SQL query contas contábeis

Regras do fórum
=============

Antes de postar sua dúvida, por favor leia as regras de utilização do fórum.
Heric Souza
Mensagens: 207
Registrado em: 24 Set 2010, 12:34

SQL query contas contábeis

Mensagem por Heric Souza » 01 Jul 2019, 17:03

Segue exemplo com criação de tabelas temporárias e cálculo de resultados em contas contábeis, bem como um exemplo para buscar o próximo código da subconta.

Código: Selecionar todos

/* Exemplo baseado no link:
	http://emersonhermann.blogspot.com/2012/09/consulta-sql-de-plano-de-contas-query.html
	sendo que foquei em MSSQL utilizando tabelas temporárias.
	hericss@gmail.com
*/

-- Removendo as tabelas temporárias.
DROP TABLE IF EXISTS #centro_custo;
DROP TABLE IF EXISTS #movimento;

-- Criando as tabelas temporárias.
CREATE TABLE #centro_custo
( 
   id_centro_custo  varchar(12) PRIMARY KEY   -- dados da conta ex. 1.02.01 
 , descricao        varchar(50)               -- descricao da conta cadastrada ex. Vendas Externas
 , tipo_conta       varchar(1)                -- tipo de conta do cc Analitica ou Sintética, dominio discreto: A ou S, em situação de produção merece uma constraint check
); 
 
CREATE TABLE #movimento 
(
   id_movimento   integer   PRIMARY KEY  -- id do #movimento, recomenda-se auto incremento, mas para simplifcar fica sem auto incremento
 , numero_doc   varchar(40)              -- numero do documento a ser informado  
 , id_centro_custo   varchar(12)         -- chave estrangeira para a tabela centro de custo, mas para simplificar apenas iremos convencionar, não será habilitado a FK, recomendo colocar not null
 , valor_movimento numeric(15,2)         -- valor informado 
);

-- Receitas 
INSERT INTO #centro_custo (id_centro_custo, descricao, tipo_conta) VALUES ('1','Receita','S');
INSERT INTO #centro_custo (id_centro_custo, descricao, tipo_conta) VALUES ('1.1','Vendas Internas','S');
INSERT INTO #centro_custo (id_centro_custo, descricao, tipo_conta) VALUES ('1.1.1','Escola','A');
INSERT INTO #centro_custo (id_centro_custo, descricao, tipo_conta) VALUES ('1.1.2','Escritório','A');
INSERT INTO #centro_custo (id_centro_custo, descricao, tipo_conta) VALUES ('1.2','Vendas Externas','S');
INSERT INTO #centro_custo (id_centro_custo, descricao, tipo_conta) VALUES ('1.2.1','Livro','A');
INSERT INTO #centro_custo (id_centro_custo, descricao, tipo_conta) VALUES ('1.2.2','Brinquedos','A');
 
-- Despesas
INSERT INTO #centro_custo (id_centro_custo, descricao, tipo_conta) VALUES ('2','Despesas','S');
INSERT INTO #centro_custo (id_centro_custo, descricao, tipo_conta) VALUES ('2.1','Fornecedores','S');
INSERT INTO #centro_custo (id_centro_custo, descricao, tipo_conta) VALUES ('2.1.1','Nacional','A');
INSERT INTO #centro_custo (id_centro_custo, descricao, tipo_conta) VALUES ('2.1.2','Importado','A');
INSERT INTO #centro_custo (id_centro_custo, descricao, tipo_conta) VALUES ('2.2','Escritório','S');
INSERT INTO #centro_custo (id_centro_custo, descricao, tipo_conta) VALUES ('2.2.10','Materiais de limpeza','A');
INSERT INTO #centro_custo (id_centro_custo, descricao, tipo_conta) VALUES ('2.2.2','Materiais de Escritório','A');
 
-- Vamos povoar a tabela #movimento: 
INSERT INTO #movimento (id_movimento, numero_doc, id_centro_custo, valor_movimento) VALUES (1,'0000021','1.1.2',50.00);
INSERT INTO #movimento (id_movimento, numero_doc, id_centro_custo, valor_movimento) VALUES (2,'0000042','1.2.2',100.00);
INSERT INTO #movimento (id_movimento, numero_doc, id_centro_custo, valor_movimento) VALUES (3,'0000084','1.2.2',160.00);
 
INSERT INTO #movimento (id_movimento, numero_doc, id_centro_custo, valor_movimento) VALUES (4,'0000142','2.2.10',40.00);
INSERT INTO #movimento (id_movimento, numero_doc, id_centro_custo, valor_movimento) VALUES (5,'0000210','2.2.2',80.00);
INSERT INTO #movimento (id_movimento, numero_doc, id_centro_custo, valor_movimento) VALUES (6,'0000242','2.2.2',20.00);
INSERT INTO #movimento (id_movimento, numero_doc, id_centro_custo, valor_movimento) VALUES (7,'0000284','2.2.10',15.00);

-- Listando conteudo de centro_custo 
SELECT * FROM #centro_custo ORDER BY 1;

-- Listando conteudo de movimento 
SELECT * FROM #movimento;

-- Query SQL Centro de Custo, para SQL Server 2012, exemplo: 
SELECT cc.id_centro_custo
	,cc.descricao
	,sum(m.valor_movimento) AS total_conta
FROM #centro_custo cc
JOIN #movimento m ON m.id_centro_custo LIKE cc.id_centro_custo + '%' -- O segredo está aqui, o campo id_centro_custo vem depois do LIKE
GROUP BY cc.id_centro_custo
	,cc.descricao
ORDER BY cc.id_centro_custo ASC;

/*** Exemplo adicionado ***/
-- Pegando o próximo código para conta contábil
SELECT MAX(CONVERT(INT, REPLACE(id_centro_custo, '2.2.', '')))+1 Proximo
FROM #centro_custo
WHERE id_centro_custo LIKE '2.2.%' -- considerando este prefixo para nosso exemplo.


-- Removendo as tabelas temporárias.
DROP TABLE IF EXISTS #centro_custo;
DROP TABLE IF EXISTS #movimento;

Responder

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante