Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.Esta consulta retorna o resultado de uma só fase. Como eu faria para que mostrasse várias fases?
Agradeço muuuuito a ajuda...
Preciso listar as fases e depois os valores de cada uma.
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!
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.
É 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.
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.
É 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)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 é:
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.
[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
Opa, fico satisfeito em ajudar no que puder sempre :D
Disponha Renata, até a próxima.
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.