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

21 respostas
rcipriani

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:

21 Respostas

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…

rcipriani

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…

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:

lucas_carvalho100

Que banco que você usa?

rcipriani

MySQL…

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

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…

rcipriani

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…

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?

lucas_carvalho100

rcipriani:
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…

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…

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…

rcipriani

lucas_carvalho100:
rcipriani:
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…

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…

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…

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

rcipriani

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?

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?

lucas_carvalho100

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?

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?

rcipriani

lucas_carvalho100:
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?

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?

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

rcipriani

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?

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…

rcipriani

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…

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…

lucas_carvalho100

Coloca tipo assim

IdFuncionario nome
1 Joao

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

rcipriani

lucas_carvalho100:
Coloca tipo assim

IdFuncionario nome
1 Joao

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

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…

lucas_carvalho100

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

-- 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  
-- 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…

rcipriani

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

-- 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  
-- 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…

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!!

lucas_carvalho100

Blz então qualquer coisa posta ai…

Abraços…

rcipriani

Para o problema acima foi tudo resolvido, porém quero fazer mais uma consulta e não sei nem por onde começar;

1 - Seguinte, tem toda aquela estutura ja psotada nessa topico

2 - Tem essa consulta:

sql = " SELECT COUNT(m.id) as total , "
                    + " 'entradas' as movimentacao, tm.id as idTipoMovimentacao, "
                    + " e.nome as equipe, e.id as idEquipe, "
                    + " i.nome as instancia, i.id as idInstancia "
                    + " FROM movimentacoes m "
                    + " RIGHT JOIN tipomovimentacoes tm ON tm.id = m.idMovimentacao "
                    + "       AND m.dataHora BETWEEN ? AND ?  "
                    + "       AND m.idMovimentacao IN ("+entradas+") "
                    + " RIGHT JOIN equipes e ON m.idEquipe = e.id "
                    + " RIGHT JOIN instancias i ON i.id = m.idInstancia "
                    + "       AND m.idInstancia IN ("+instancia+") "
                    + " GROUP BY i.nome, e.nome, tm.nome "
                    + " UNION "
                    + " SELECT COUNT(m.id) as total,  "
                    + "        'saidas' as movimentacao, tm.id as idTipoMovimentacao, "
                    + "        e.nome as equipe, e.id as idEquipe, "
                    + "        i.nome as instancia, i.id as idInstancia "
                    + " FROM movimentacoes m "
                    + " RIGHT JOIN tipomovimentacoes tm ON tm.id = m.idMovimentacao "
                    + "       AND m.dataHora BETWEEN ? AND ? "
                    + "       AND m.idMovimentacao IN ("+saidas+") "
                    + " RIGHT JOIN equipes e ON m.idEquipe = e.id "
                    + " RIGHT JOIN instancias i ON i.id = m.idInstancia "
                    + "       AND m.idInstancia IN ("+instancia+") "
                    + " GROUP BY i.nome, e.nome, tm.nome "
                    + " UNION "
                    + " SELECT COUNT(m.id) as total,   "
                    + "       'entradasAnterior' as movimentacao, tm.id as idTipoMovimentacao, "
                    + "      e.nome as equipe, e.id as idEquipe, "
                    + "       i.nome as instancia, i.id as idInstancia "
                    + " FROM movimentacoes m "
                    + " RIGHT JOIN tipomovimentacoes tm ON tm.id = m.idMovimentacao   "
                    + "       AND m.dataHora NOT BETWEEN ? AND ? "
                    + "       AND m.idMovimentacao IN ("+entradas+") "
                    + " RIGHT JOIN equipes e ON m.idEquipe = e.id "
                    + " RIGHT JOIN instancias i ON i.id = m.idInstancia "
                    + "       AND m.idInstancia IN ("+instancia+") "
                    + " GROUP BY i.nome, e.nome"
                    + " UNION "
                    + " SELECT COUNT(m.id) as total,   "
                    + "       'saidasAnterior' as movimentacao, tm.id as idTipoMovimentacao, "
                    + "      e.nome as equipe, e.id as idEquipe, "
                    + "       i.nome as instancia, i.id as idInstancia "
                    + " FROM movimentacoes m "
                    + " RIGHT JOIN tipomovimentacoes tm ON tm.id = m.idMovimentacao   "
                    + "       AND m.dataHora NOT BETWEEN ? AND ? "
                    + "       AND m.idMovimentacao IN ("+saidas+") "
                    + " RIGHT JOIN equipes e ON m.idEquipe = e.id "
                    + " RIGHT JOIN instancias i ON i.id = m.idInstancia "
                    + "       AND m.idInstancia IN ("+instancia+") "
                    + " GROUP BY i.nome, e.nome";

Tenho mais duas tabelas envolvidas:
OPERACAO: id, numeroOperacao, idModalidade
ADESAO: id, idOperacao

E na tabela MOVIMENTACOES, como mostrado anteriormente eu tenho o id da adesão.

O FILTRO QUE QUERO ADICIONAR É O SEGUINTE:
Filtrar por tipo de modalidade, da mesma maneira que está filtrando por tipo de instancia. Porém a informação do tipo de modalidade está na operacao.
MOVIMENTACOES contém idAdesao ADESAO contém idOperacao OPERACAO contém idModalidade.

Acho que deu pra entender.

Grato!!

Criado 22 de setembro de 2010
Ultima resposta 22 de nov. de 2010
Respostas 21
Participantes 2