[NOVA DÚVIDA] Consulta SQL ao meu ver bem f***!

Então tenho que fazer um relatório, porém tenho dados em várias tabelas.

Vou citar as tabelas e como tem que ficar o relatório final:

TABELAS
movimentacoes: id, idMovimentacao, matriculaFuncionario, dataHora, idInstancia
tipomovimentacoes: id, nome (entrada, saida, analise, etc)
instancias: id, nome (1 analise, Recurso, CER)
equipes: id, nome (mais 1, mais 2, trad)

RELATORIO

Os valores ali são a soma de uma determinada movimentação em um período de tempo, ex.: 1 mês;

Alguém se arrisca?!?! :wink:

Vc pode criar uma procedure e inserir os dados em uma tabela temporaria… Te aconselho a fazer um select separado para cada tipo de movimento…
Caso vc use o oracle use o with table… Resolve muito bem esse problema…

Abraços…

[quote=lucas_carvalho100]Vc pode criar uma procedure e inserir os dados em uma tabela temporaria… Te aconselho a fazer um select separado para cada tipo de movimento…
Caso vc use o oracle use o with table… Resolve muito bem esse problema…

Abraços…[/quote]

Sei que o certo seria eu estudar procedures e outras noções de SQL, ja tenho bastante, mas não o suficiente para esta consulta.
Se eu for estudar isso agora não vou conseguir tão cedo, imagino que com este exemplo ja feito vai ser se grande ajuda para entender o conseito, e nos próxímos relatórios vai ficar mais fácil.

Tem como escrever esse exemplo?

Grato! :smiley:

Que banco que você usa?

MySQL…

Complementando o que você falou la em cima, tu aconselha um SELECT para cada coluna do relatório então né?

Pode ficar assim no caso do mysql

select * -- aqui vc coloca os campos que você quer
  from movimentacoes m
  join tipomovimentacao tm on tm.id = m.idmovimentacao and tm.id = 1
union
select *  -- aqui vc coloca os campos que você quer
  from movimentacoes m
  join tipomovimentacao tm on tm.id = m.idmovimentacao and tm.id = 2

Lembrando que quando você usa union você deve ter a mesma quantidade de campos selecionados em todas as querys

Qualquer duvida posta ai…

[quote=lucas_carvalho100]Pode ficar assim no caso do mysql

select * -- aqui vc coloca os campos que você quer
  from movimentacoes m
  join tipomovimentacao tm on tm.id = m.idmovimentacao and tm.id = 1
union
select *  -- aqui vc coloca os campos que você quer
  from movimentacoes m
  join tipomovimentacao tm on tm.id = m.idmovimentacao and tm.id = 2

Lembrando que quando você usa union você deve ter a mesma quantidade de campos selecionados em todas as querys

Qualquer duvida posta ai…[/quote]

Opa, ja ta começando a ficar certo sim…

Acho que pra gerar aqueles números do relatório teria que fazer um COUNT, agupando os dados por equipe… pois pra cada instância tem as equipes dentro…

Mudei a consulta assim:

select * – aqui vc coloca os campos que você quer
from movimentacoes m
join tipomovimentacoes tm on tm.id = m.idmovimentacao and tm.id IN (1,12)

retorna a mesma coisa, ta errado?

[quote=rcipriani][quote=lucas_carvalho100]Pode ficar assim no caso do mysql

select * -- aqui vc coloca os campos que você quer
  from movimentacoes m
  join tipomovimentacao tm on tm.id = m.idmovimentacao and tm.id = 1
union
select *  -- aqui vc coloca os campos que você quer
  from movimentacoes m
  join tipomovimentacao tm on tm.id = m.idmovimentacao and tm.id = 2

Lembrando que quando você usa union você deve ter a mesma quantidade de campos selecionados em todas as querys

Qualquer duvida posta ai…[/quote]

Opa, ja ta começando a ficar certo sim…

Acho que pra gerar aqueles números do relatório teria que fazer um COUNT, agupando os dados por equipe… pois pra cada instância tem as equipes dentro…[/quote]

Você pode fazer um count sim… Deve funcionar…

Qualquer coisa poste suas duvidas…

Se resolveu seu problema… Edite o tópico e coloque [RESOLVIDO].

Espero ter ajudado…

Abraços…

[quote=lucas_carvalho100][quote=rcipriani][quote=lucas_carvalho100]Pode ficar assim no caso do mysql

select * -- aqui vc coloca os campos que você quer
  from movimentacoes m
  join tipomovimentacao tm on tm.id = m.idmovimentacao and tm.id = 1
union
select *  -- aqui vc coloca os campos que você quer
  from movimentacoes m
  join tipomovimentacao tm on tm.id = m.idmovimentacao and tm.id = 2

Lembrando que quando você usa union você deve ter a mesma quantidade de campos selecionados em todas as querys

Qualquer duvida posta ai…[/quote]

Opa, ja ta começando a ficar certo sim…

Acho que pra gerar aqueles números do relatório teria que fazer um COUNT, agupando os dados por equipe… pois pra cada instância tem as equipes dentro…[/quote]

Você pode fazer um count sim… Deve funcionar…

Qualquer coisa poste suas duvidas…

Se resolveu seu problema… Edite o tópico e coloque [RESOLVIDO].

Espero ter ajudado…

Abraços…[/quote]

Vou fazer mais uns testes, e assim que conseguir chegar no final do relatório eu coloco como resolvido, thanks

Então, com essa aqui eu não consegui chegar no meu relatório:

select * , COUNT(m.id) as total
from movimentacoes m
join tipomovimentacoes tm on tm.id = m.idmovimentacao and tm.id = 1
union
select * , COUNT(m.id) as total
from movimentacoes m
join tipomovimentacoes tm on tm.id = m.idmovimentacao and tm.id = 12

É porque eu preciso listar por instancias e dentro de cada instância as equipes, como mostra a figura la em cima…

ALguém?

Pra próxima resposta vir joinha, vou explicar melhor:

  • Cada funcionário pertence a uma equipe.
  • Uma movimentação pode ter varias instâncias

o que eu preciso é, listar as instâncias, e dentro de cada uma listar as equipes e nas equipes listar quantas movimentação teve com o tal filtro naquela instância…

Complicado?

[quote=rcipriani]Pra próxima resposta vir joinha, vou explicar melhor:

  • Cada funcionário pertence a uma equipe.
  • Uma movimentação pode ter varias instâncias

o que eu preciso é, listar as instâncias, e dentro de cada uma listar as equipes e nas equipes listar quantas movimentação teve com o tal filtro naquela instância…

Complicado?[/quote]

select * -- aqui vc coloca os campos que você quer  
  from movimentacoes m  
  join tipomovimentacao tm on tm.id = m.idmovimentacao and tm.id = 1  
  join instancia i on i.id = m.idinstancia
union  
select *  -- aqui vc coloca os campos que você quer  
  from movimentacoes m  
  join tipomovimentacao tm on tm.id = m.idmovimentacao and tm.id = 2  
  join instancia i on i.id = m.idinstancia

Cara é só você colocar as outras tabelas… Vc deve relacionar agora os funcionários com a instância…

Certo?

[quote=lucas_carvalho100][quote=rcipriani]Pra próxima resposta vir joinha, vou explicar melhor:

  • Cada funcionário pertence a uma equipe.
  • Uma movimentação pode ter varias instâncias

o que eu preciso é, listar as instâncias, e dentro de cada uma listar as equipes e nas equipes listar quantas movimentação teve com o tal filtro naquela instância…

Complicado?[/quote]

select * -- aqui vc coloca os campos que você quer  
  from movimentacoes m  
  join tipomovimentacao tm on tm.id = m.idmovimentacao and tm.id = 1  
  join instancia i on i.id = m.idinstancia
union  
select *  -- aqui vc coloca os campos que você quer  
  from movimentacoes m  
  join tipomovimentacao tm on tm.id = m.idmovimentacao and tm.id = 2  
  join instancia i on i.id = m.idinstancia

Cara é só você colocar as outras tabelas… Vc deve relacionar agora os funcionários com a instância…

Certo?
[/quote]

Imagino que sim, to tentando até agora, a hora que conseguir eu posto, mas ta fueda

Nada de eu conseguir fazer isso, to a tarde toda em cima.

Gostaria daquelas tabelas trazer todas aquelas informações do relatório…

Alguém mais se Habilita?

Olha para poder te ajudar melhor, poste os valores daquelas tabelas e a forma que você quer que elas fiquem dispostas no relatório…

Igual ao 1° item que você escreveu…

[quote=lucas_carvalho100]Olha para poder te ajudar melhor, poste os valores daquelas tabelas e a forma que você quer que elas fiquem dispostas no relatório…

Igual ao 1° item que você escreveu…[/quote]

SEI QUE NÃO É SIMPLES, ENTÃO BEM EXPLICADO DESSA VEZ, VLW…

Então tenho que fazer DOIS relatório, porém tenho dados em várias tabelas.

Vou citar as tabelas e como tem que ficar o relatório final:

TABELAS
movimentacoes:
campos: id, idMovimentacao, idFuncionario, dataHora, …, idInstancia
tipomovimentacoes:
campos: id, nome
valores: entrada, saida, analise …
instancias:
campos: id, nome
valores: 1ª analise, Recurso, CER …
equipes:
campos: id, nome
valores: mais 1, mais 2, trad …
funcionarios:
campos: id, nome, …, idEquipe

RELATÓRIO 1

RELATÓRIO 2

Os valores que aparecem (1000,800,200…) é a soma das movimentações em um tal periodo de um certo tipo de movimentacao, EX: entrada, saida…

No primeiro relatório os valores são agrupados por equipes, que as mesmas ficam dentro das instâncias…
No segundo é bem parecido, só que não agrupa em equipes, mostra o total de modificações por funcionários…

Se ainda ficou alguma coisa confusa me avisa que eu edito esse post…

Agradeço desde ja a atenção…

Coloca tipo assim

IdFuncionario nome
1 Joao

E coloca a forma que você quer que aparece os dados com dados reais…

[quote=lucas_carvalho100]Coloca tipo assim

IdFuncionario nome
1 Joao

E coloca a forma que você quer que aparece os dados com dados reais…[/quote]

SEI QUE NÃO É SIMPLES, ENTÃO BEM EXPLICADO DESSA VEZ, VLW…

Então tenho que fazer DOIS relatório, porém tenho dados em várias tabelas.

Vou citar as tabelas e como tem que ficar o relatório final:

TABELAS
movimentacoes:

tipomovimentacoes:

instancias:

equipes:

funcionarios:

SQL para gerar as tabelas:
http://www.ponteweb.com.br/proagroTESTE.sql

RELATÓRIO 1

RELATÓRIO 2

Os valores que aparecem (1000,800,200…) é a soma das movimentações em um tal periodo de um certo tipo de movimentacao, EX: entrada, saida…

No primeiro relatório os valores são agrupados por equipes, que as mesmas ficam dentro das instâncias…
No segundo é bem parecido, só que não agrupa em equipes, mostra o total de modificações por funcionários…

Se ainda ficou alguma coisa confusa me avisa que eu edito esse post…

Agradeço desde ja a atenção…

Iniciei aqui os dois… Agora é com vc… Qualquer coisa posta ai…

--1° SELECT
SELECT COUNT(M.IDMOVIMENTACOES),
       MT.NOME,
	   I.NOME         
  FROM MOVIMENTACOES M
  JOIN TIPOMOVIMENTACAO MT ON MT.ID = M.IDMOVIMENTACAO
  JOIN INSTACIA I ON I.ID = M.IDINSTANCIA
GROUP BY MT.NOME,I.NOME  
--2° SELECT
SELECT COUNT(M.IDMOVIMENTACOES),
       MT.NOME,
	   F.NOME         
  FROM MOVIMENTACOES M
  JOIN TIPOMOVIMENTACAO MT ON MT.ID = M.IDMOVIMENTACAO
  JOIN FUNCIONARIO F ON F.ID = M.IDFUNCIONARIO
GROUP BY MT.NOME,F.NOME

Da uma olhada e ve se isso mesmo que vc quer…

[quote=lucas_carvalho100]Iniciei aqui os dois… Agora é com vc… Qualquer coisa posta ai…

--1° SELECT
SELECT COUNT(M.IDMOVIMENTACOES),
       MT.NOME,
	   I.NOME         
  FROM MOVIMENTACOES M
  JOIN TIPOMOVIMENTACAO MT ON MT.ID = M.IDMOVIMENTACAO
  JOIN INSTACIA I ON I.ID = M.IDINSTANCIA
GROUP BY MT.NOME,I.NOME  
--2° SELECT
SELECT COUNT(M.IDMOVIMENTACOES),
       MT.NOME,
	   F.NOME         
  FROM MOVIMENTACOES M
  JOIN TIPOMOVIMENTACAO MT ON MT.ID = M.IDMOVIMENTACAO
  JOIN FUNCIONARIO F ON F.ID = M.IDFUNCIONARIO
GROUP BY MT.NOME,F.NOME

Da uma olhada e ve se isso mesmo que vc quer…

[/quote]

Mexi um pouco, mas deu certo sim!!!

Nota, a lógica do programa estava errada, na movimentação eu não estava guardando o id da Equipe, então caso o funcionário mudasse de equipe, detonava os relatórios, então incluir o campo idEquipe na movimentacao.

O SQL para o RELATORIO 1 ficou assim:

SELECT COUNT(m.id), tm.nome as movimentacao, e.nome as equipe, i.nome as instancia FROM movimentacoes m RIGHT JOIN tipomovimentacoes tm ON tm.id = m.idMovimentacao AND m.dataHora BETWEEN "2010-09-01" AND "2010-09-30" AND idMovimentacao IN (1,14) RIGHT JOIN equipes e ON m.idEquipe = e.id RIGHT JOIN instancias i ON i.id = m.idInstancia GROUP BY i.nome, e.nome, tm.nome

Ainda não fiz para o segundo, mas acho que vai ser tranquilo…

Vou deixar como resolvido esse post, caso tenha alguma outra dúvida, reabro ele…

Muito obrigado mesmo pela atenção, Abraços!!