Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

renatagramos

[Resolvido] Consulta em várias tabelas

Recommended Posts

Olá, pessoal!

 

Estou com um problema em uma consulta e preciso da ajuda de vocês, por favor:

 

SELECT 
mp.VLR_HORAS_PREV         AS "VLR_HORAS_PREV_PREVISTA",
mp.VLR_HORAS_PREV_APOIO   AS "VLR_HORAS_PREV_APOIO_PREVISTA",
mv.VLR_HORAS_PREV         AS "VLR_HORAS_PREV_SINTETICA",
mv.VLR_HORAS_PREV_APOIO   AS "VLR_HORAS_PREV_APOIO_SINTETICA",
(SELECT
	SUM(VLR_VALOR+VLR_REDUCAO_IPI+VLR_DEPRECIACAO+VLR_AMORTIZACAO)
		FROM iwprd_fin.pf_form_bens_servicos_valores 
			WHERE COD_TAREFA = 34194 AND COD_FASE = 31) AS "VLR_BENS_SERVICOS_PREVISTO", // o 'COD_FASE' não é 1 só, são vários.
(SELECT
	SUM(VLR_VALOR+VLR_REDUCAO_IPI+VLR_DEPRECIACAO+VLR_AMORTIZACAO)
		FROM iwprd_fin.pf_form_bens_servicos_valores_sintetico
			WHERE COD_TAREFA = 34194 AND COD_FASE = 31) AS "VLR_BENS_SERVICOS_SINTETICO"  // o 'COD_FASE' não é 1 só, são vários.
FROM iwprd_wfw.wfi_tarefa AS t
LEFT JOIN iwprd_fin.pf_form_mao_obra_prevista mp ON t.COD_TAREFA = mp.COD_TAREFA
LEFT JOIN iwprd_fin.pf_form_mao_obra_sintetica mv ON t.COD_TAREFA = mv.COD_TAREFA
WHERE t.COD_TAREFA = 34194
AND mp.COD_FASE  = 31  // o 'COD_FASE' não é 1 só, são vários.
AND mv.COD_FASE  = 31  // o 'COD_FASE' não é 1 só, são vários.

 

Esta consulta retorna o resultado de uma só fase. Como eu faria para que mostrasse várias fases?

 

Agradeço muuuuito a ajuda...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde senhorita,

 

Pelo que eu entendi você quer que o teu WHERE possa filtrar várias fases. Sendo assim, utilize o IN. Exemplo:

 

SELECT campos FROM tabela WHERE COD_FASE IN (31,32,35,42,50)

Com o IN você pode especificar vários valores no mesmo filtro.

 

Acho que é isso que precisa, espero que ajude, fico a disposição, abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi, Diego!

 

É isso, já tentei, mas a busca pela quantidade de fases também tem que ser feita nesta query. Não tem um número certo.

 

Obrigada!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como assim a quantidade de fases?

 

Você não sabe quantas fases haverão dentro do seu WHERE COD_FASE IN ( ) é isso?

 

Essa questão acho que você controla pela aplicação daí. Por exemplo um looping que vai concatenando todos os códigos de fases que você quer pesquisar.

 

Acho que é isso pelo que entendi :D Fico a disposição.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É por aí... Mas temos que seguir algumas regras. Então é necessário listar tudo por essa query.

 

Primeiro eu identifico quantas fases tem e quais são, depois listo os valores de 4 tabelas dentro de cada fase.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok acho que não estou mais entendendo. Você tem N fases, não basta colocá-las dentro do IN e pronto? O SELECT traria todas as informações de todas as fases dentro do IN.

 

Poste um exemplo das tabelas preenchidas com alguns dados e a forma de resultado que você espera ter.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É assim:

 

Eu registro um novo projeto;

Este projeto tem 'N' fases;

Cada fase 4 valores previstos e mais 4 valores reais (que podem ser nulos também);

 

Preciso montar uma tabela listando cada fase com seus respectivos valores;

 

SELECT SQL_CALC_FOUND_ROWS  
mp.VLR_HORAS_PREV AS "VLR_HORAS_PREV_PREVISTA",
mp.VLR_HORAS_PREV_APOIO   AS "VLR_HORAS_PREV_APOIO_PREVISTA",
mv.VLR_HORAS_PREV         AS "VLR_HORAS_PREV_SINTETICA",
mv.VLR_HORAS_PREV_APOIO   AS "VLR_HORAS_PREV_APOIO_SINTETICA",
(SELECT
	SUM(VLR_VALOR+VLR_REDUCAO_IPI+VLR_DEPRECIACAO+VLR_AMORTIZACAO)
		FROM iwprd_fin.pf_form_bens_servicos_valores 
			WHERE COD_TAREFA = 34194 AND COD_FASE = 31) AS "VLR_BENS_SERVICOS_PREVISTO",
(SELECT
	SUM(VLR_VALOR+VLR_REDUCAO_IPI+VLR_DEPRECIACAO+VLR_AMORTIZACAO)
		FROM iwprd_fin.pf_form_bens_servicos_valores_sintetico
			WHERE COD_TAREFA = 34194 AND COD_FASE = 31) AS "VLR_BENS_SERVICOS_SINTETICO"
FROM iwprd_wfw.wfi_tarefa AS t
		LEFT JOIN iwprd_fin.pf_form_mao_obra_prevista mp ON t.COD_TAREFA = mp.COD_TAREFA
		LEFT JOIN iwprd_fin.pf_form_mao_obra_sintetica mv ON t.COD_TAREFA = mv.COD_TAREFA
		WHERE t.COD_TAREFA = 34194
		AND mp.COD_FASE  IN (31,33)
		AND mv.COD_FASE  IN (31,33)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Huuum, ou seja, estruturando:

 

_Busca o projeto

___Busca a primeira fase dele

_____Busca os valores da primeira fase

___Fim primeira fase

___Busca a segunda fase

_____Busca os valores da segunda fase

___Fim segunda fase

___Busca a terceira fase

_____Busca os valores da terceira fase

___Fim terceira fase

___Busca a quarta fase

_____Busca os valores da quarta fase

___Fim quarta fase

_Fim da busca deste projeto

 

E você precisa fazer isso pra N projetos. Em suma, você buscará um projeto X, e suas fases X_F1, X_F2, X_F3 e X_F4.

 

O seu problema é:

 

- Você não sabe o COD_FASE pra cada projeto (claro, pois é uma rotina variável então estes códigos sempre mudarão). Sendo assim você não pode fazer um IN com números fixos como eu te passei.

 

Estou certo até aqui? Esqueci de algum detalhe? Por favor me corrija se eu tiver entendido errado e aponte os erros no esquema que eu fiz acima.

 

EDIT:

 

Eu usei 4 fases como exemplo, mas entendi que são N fases pra cada projeto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

[RESOLVIDO]

 

Perfeito, Diego!

 

Um dos analistas conseguiu resolver assim:

 

		SELECT
			t.cod_tarefa,
			pf.cod_fase,
			IFNULL((SELECT mp.VLR_HORAS_PREV
			FROM iwprd_fin.pf_form_mao_obra_prevista mp
			WHERE mp.cod_tarefa = t.cod_tarefa
			AND mp.cod_fase = pf.cod_fase ), 0) a,
			IFNULL((SELECT mp.VLR_HORAS_PREV_APOIO
			FROM iwprd_fin.pf_form_mao_obra_prevista mp
			WHERE mp.cod_tarefa = t.cod_tarefa
			AND mp.cod_fase = pf.cod_fase ), 0) b,
			IFNULL((SELECT mp.VLR_HORAS_PREV
			FROM iwprd_fin.pf_form_mao_obra_sintetica mp
			WHERE mp.cod_tarefa = t.cod_tarefa
			AND mp.cod_fase = pf.cod_fase ), 0) c,
			IFNULL((SELECT mp.VLR_HORAS_PREV_APOIO
			FROM iwprd_fin.pf_form_mao_obra_sintetica mp
			WHERE mp.cod_tarefa = t.cod_tarefa
			AND mp.cod_fase = pf.cod_fase ), 0) d,
			IFNULL(( SELECT SUM(bsv.vlr_valor + bsv.vlr_reducao_ipi + bsv.vlr_depreciacao + bsv.vlr_amortizacao)
			FROM iwprd_fin.pf_form_bens_servicos_valores bsv
			WHERE bsv.cod_tarefa = t.cod_tarefa
			AND bsv.cod_fase = pf.cod_fase ), 0) e,
			IFNULL(( SELECT SUM(bsvs.vlr_valor + bsvs.vlr_reducao_ipi + bsvs.vlr_depreciacao + bsvs.vlr_amortizacao)
			FROM iwprd_fin.pf_form_bens_servicos_valores_sintetico bsvs
			WHERE bsvs.cod_tarefa = t.cod_tarefa
			AND bsvs.cod_fase = pf.cod_fase ), 0) f
			FROM iwprd_wfw.wfi_tarefa t
		LEFT JOIN iwprd_fin.pf_form_dados_projeto dp ON t.COD_TAREFA = dp.COD_TAREFA
		LEFT JOIN iwprd_fin.pf_fases pf ON dp.COD_GRUPO = pf.COD_GRUPO
		WHERE t.cod_tarefa = '.$intCodigoTarefa;

 

Valeu muito pela força e disposição em ajudar, Diego.

 

Obrigada!!!

 

Renata

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, fico satisfeito em ajudar no que puder sempre :D

 

Disponha Renata, até a próxima.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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