Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Amigos,
estamos montando uma query e fica uma duvida, qual a melhor forma de utilizar o resultado atribuído de um CASE para fazer outra conta em uma outra coluna.
segue um exemplo:
SELECT
CASE
WHEN TABELA.CAMPO = 1 THEN TABELA.CAMPO + 1
ELSE TABELA.CAMPO + 2
END AS CAMPO1,
(CAMPO1 + 10) AS CAMPO2
FROM TABELA
MUITO OBRIGADO!
Perfeito Amigo, funcionou bem...
tive uma outra duvida neste mesmo projeto,
temos uma solicitação para uma pessoa e dentro desta temos ate 4 resultados, fiz uma quebra com o GROUP BY, e utilizando o MIN e MAX.
peguei o menor e o maior valor numa mesma linha. como pego também os 2 outros possíveis valores, note(apos o comentário "-- BUSCA ATE 4 MARCAÇÕES DENTRO DA SOLICITAÇÃO -- ") que para isso, adicionei 4 vezes a mesma tabela, esta funcionando mas com pouca performance...
existe outra forma?
segue o select para entender o contexto::::
SELECT
NUMEMP,
NOMEMP,
CODCCU,
NOMCCU,
MOTSIT,
DESMSI,
TIPCOL,
NUMCAD,
NOMFUN,
REALIZADO,
REALIZADO + 2 AS CUSTO,
DATINI,
DATFIM,
HORINI,
HORFIM,
USU_APRN01
FROM
(
SELECT
EMP.NUMEMP,
EMP.NOMEMP,
CCU.CODCCU,
CCU.NOMCCU,
MOT.MOTSIT,
MOT.DESMSI,
SIH.TIPCOL,
FUN.NUMCAD,
FUN.NOMFUN,
CASE
WHEN MHR.SEQMAR = 1 THEN
CASE
WHEN SIH.DATINI = SIH.DATFIM THEN
CASE
WHEN (MIN(ACC1.HORACC) > 0)AND(MIN(ACC2.HORACC) > 0)AND(MIN(ACC3.HORACC) > 0)AND(MAX(ACC4.HORACC) > 0) THEN
(MIN(ACC2.HORACC) - MIN(ACC1.HORACC))+(MAX(ACC4.HORACC) - MIN(ACC3.HORACC))
WHEN (MIN(ACC1.HORACC) > 0)AND(MIN(ACC2.HORACC) > 0)AND(MIN(ACC3.HORACC) > 0)AND(MAX(ACC4.HORACC) IS NULL) THEN
(MIN(ACC2.HORACC) - MIN(ACC1.HORACC))+(SIH.HORFIM - MIN(ACC3.HORACC))
WHEN (MIN(ACC1.HORACC) > 0)AND(MIN(ACC2.HORACC) > 0)AND(MIN(ACC3.HORACC) IS NULL)AND(MAX(ACC4.HORACC) IS NULL) THEN
(MIN(ACC2.HORACC) - MIN(ACC1.HORACC))
WHEN (MIN(ACC1.HORACC) > 0)AND(MIN(ACC2.HORACC) IS NULL)AND(MIN(ACC3.HORACC) IS NULL)AND(MAX(ACC4.HORACC) IS NULL) THEN
(SIH.HORFIM - MIN(ACC1.HORACC))
END
ELSE
CASE
WHEN (MIN(ACC1.HORACC) > 0)AND(MIN(ACC2.HORACC) > 0)AND(MIN(ACC3.HORACC) > 0)AND(MAX(ACC4.HORACC) > 0) THEN
CASE
WHEN (MIN(ACC1.HORACC) > MIN(ACC2.HORACC)) THEN
((1140 - MIN(ACC1.HORACC)) + MIN(ACC2.HORACC)) + (MAX(ACC4.HORACC) - MIN(ACC3.HORACC))
WHEN (MIN(ACC3.HORACC) > MAX(ACC4.HORACC)) THEN
(MIN(ACC2.HORACC) - MIN(ACC1.HORACC)) + ((1440 - MIN(ACC3.HORACC)) + MAX(ACC4.HORACC))
ELSE
(MIN(ACC2.HORACC) - MIN(ACC1.HORACC)) + (MAX(ACC4.HORACC) - MIN(ACC3.HORACC))
END
WHEN (MIN(ACC1.HORACC) > 0)AND(MIN(ACC2.HORACC) > 0)AND(MIN(ACC3.HORACC) > 0)AND(MAX(ACC4.HORACC) IS NULL) THEN
CASE
WHEN (MIN(ACC1.HORACC) > MIN(ACC2.HORACC)) THEN
((1440 - MIN(ACC1.HORACC)) + MIN(ACC2.HORACC)) + (SIH.HORFIM - MIN(ACC3.HORACC))
WHEN (MIN(ACC3.HORACC) > SIH.HORFIM) THEN
(MIN(ACC2.HORACC) - MIN(ACC1.HORACC)) + ((1440 - MIN(ACC3.HORACC)) + SIH.HORFIM)
ELSE
(MIN(ACC2.HORACC) - MIN(ACC1.HORACC)) + (SIH.HORFIM - MIN(ACC3.HORACC))
END
WHEN (MIN(ACC1.HORACC) > 0)AND(MIN(ACC2.HORACC) > 0)AND(MIN(ACC3.HORACC) IS NULL)AND(MAX(ACC4.HORACC) IS NULL) THEN
CASE
WHEN (MIN(ACC1.HORACC) > MIN(ACC2.HORACC)) THEN
(1440 - MIN(ACC1.HORACC)) + MIN(ACC2.HORACC)
ELSE
MIN(ACC2.HORACC) - MIN(ACC1.HORACC)
END
WHEN (MIN(ACC1.HORACC) > 0)AND(MIN(ACC2.HORACC) IS NULL)AND(MIN(ACC3.HORACC) IS NULL)AND(MAX(ACC4.HORACC) IS NULL) THEN
CASE
WHEN (MIN(ACC1.HORACC) > SIH.HORFIM) THEN
(1440 - MIN(ACC1.HORACC)) + SIH.HORFIM
ELSE
SIH.HORFIM - MIN(ACC1.HORACC)
END
END
END
WHEN (MHR.SEQMAR = 4)or(MHR.SEQMAR IS NULL) THEN
CASE
WHEN SIH.DATINI = SIH.DATFIM THEN
CASE
WHEN (MIN(ACC1.HORACC) > 0)AND(MIN(ACC2.HORACC) > 0)AND(MIN(ACC3.HORACC) > 0)AND(MAX(ACC4.HORACC) > 0) THEN
(MIN(ACC2.HORACC) - MIN(ACC1.HORACC))+(MAX(ACC4.HORACC) - MIN(ACC3.HORACC))
WHEN (MIN(ACC1.HORACC) > 0)AND(MIN(ACC2.HORACC) > 0)AND(MIN(ACC3.HORACC) > 0)AND(MAX(ACC4.HORACC) IS NULL) THEN
(MIN(ACC1.HORACC)-SIH.HORINI)+(MAX(ACC3.HORACC) - MIN(ACC2.HORACC))
WHEN (MIN(ACC1.HORACC) > 0)AND(MIN(ACC2.HORACC) > 0)AND(MIN(ACC3.HORACC) IS NULL)AND(MAX(ACC4.HORACC) IS NULL) THEN
(MIN(ACC2.HORACC) - MIN(ACC1.HORACC))
WHEN (MIN(ACC1.HORACC) > 0)AND(MIN(ACC2.HORACC) IS NULL)AND(MIN(ACC3.HORACC) IS NULL)AND(MAX(ACC4.HORACC) IS NULL) THEN
(MIN(ACC1.HORACC)-SIH.HORINI)
END
ELSE
CASE
WHEN (MIN(ACC1.HORACC) > 0)AND(MIN(ACC2.HORACC) > 0)AND(MIN(ACC3.HORACC) > 0)AND(MAX(ACC4.HORACC) > 0) THEN
CASE
WHEN (MIN(ACC1.HORACC) > MIN(ACC2.HORACC)) THEN
((1440 - MIN(ACC1.HORACC)) + MIN(ACC2.HORACC)) + (MAX(ACC4.HORACC) - MIN(ACC3.HORACC))
WHEN (MIN(ACC3.HORACC) > MAX(ACC4.HORACC)) THEN
(MIN(ACC2.HORACC) - MIN(ACC1.HORACC)) + ((1440 - MIN(ACC3.HORACC)) + MAX(ACC4.HORACC))
ELSE
(MIN(ACC2.HORACC) - MIN(ACC1.HORACC)) + (MAX(ACC4.HORACC) - MIN(ACC3.HORACC))
END
WHEN (MIN(ACC1.HORACC) > 0)AND(MIN(ACC2.HORACC) > 0)AND(MIN(ACC3.HORACC) > 0)AND(MAX(ACC4.HORACC) IS NULL) THEN
CASE
WHEN (SIH.HORINI > MIN(ACC1.HORACC)) THEN
((1440 - SIH.HORINI) + MIN(ACC1.HORACC)) + (MIN(ACC3.HORACC) - MIN(ACC2.HORACC))
WHEN (MIN(ACC2.HORACC) > MIN(ACC3.HORACC)) THEN
(MIN(ACC1.HORACC) - SIH.HORINI) + ((1440 - MIN(ACC2.HORACC)) + MIN(ACC3.HORACC))
ELSE
(MIN(ACC1.HORACC) - SIH.HORINI) + (MIN(ACC3.HORACC) - MIN(ACC2.HORACC))
END
WHEN (MIN(ACC1.HORACC) > 0)AND(MIN(ACC2.HORACC) > 0)AND(MIN(ACC3.HORACC) IS NULL)AND(MAX(ACC4.HORACC) IS NULL) THEN
CASE
WHEN (MIN(ACC1.HORACC) > MIN(ACC2.HORACC)) THEN
(1440 - MIN(ACC1.HORACC)) + MIN(ACC2.HORACC)
ELSE
MIN(ACC2.HORACC) - MIN(ACC1.HORACC)
END
WHEN (MIN(ACC1.HORACC) > 0)AND(MIN(ACC2.HORACC) IS NULL)AND(MIN(ACC3.HORACC) IS NULL)AND(MAX(ACC4.HORACC) IS NULL) THEN
CASE
WHEN (SIH.HORINI > MIN(ACC1.HORACC)) THEN
(1440 - SIH.HORINI) + MIN(ACC1.HORACC)
ELSE
MIN(ACC1.HORACC) - SIH.HORINI
END
END
END
END AS REALIZADO,
SIH.DATINI,
SIH.DATFIM,
SIH.HORINI,
SIH.HORFIM,
SIH.USU_APRN01
FROM
R064SIH SIH
-- FICHA BÁSICA DO COLABORADOR --
INNER JOIN R034FUN FUN ON FUN.NUMEMP = SIH.NUMEMP AND
FUN.TIPCOL = SIH.TIPCOL AND
FUN.NUMCAD = SIH.NUMCAD
-- BUSCA EMPRESA DO COLABORADOR --
INNER JOIN R030EMP EMP ON EMP.NUMEMP = SIH.NUMEMP
-- MONTA HISTÓRICO DE SALARIO --
INNER JOIN R038HSA HSA ON HSA.NUMEMP = SIH.NUMEMP AND
HSA.TIPCOL = SIH.TIPCOL AND
HSA.NUMCAD = SIH.NUMCAD AND
(HSA.DATALT =(SELECT MAX(HSA_2.DATALT)
FROM R038HSA HSA_2
WHERE HSA_2.NUMEMP = SIH.NUMEMP AND
HSA_2.TIPCOL = SIH.TIPCOL AND
HSA_2.NUMCAD = SIH.NUMCAD AND
HSA_2.DATALT<= SIH.DATINI)) AND
(HSA.SEQALT = (SELECT MAX(HSA_3.SEQALT)
FROM R038HSA HSA_3
WHERE HSA_3.NUMEMP = SIH.NUMEMP AND
HSA_3.TIPCOL = SIH.TIPCOL AND
HSA_3.NUMCAD = SIH.NUMCAD AND
HSA_3.DATALT =(SELECT MAX(HSA_4.DATALT)
FROM R038HSA HSA_4
WHERE HSA_4.NUMEMP = SIH.NUMEMP AND
HSA_4.TIPCOL = SIH.TIPCOL AND
HSA_4.NUMCAD = SIH.NUMCAD AND
HSA_4.DATALT<= SIH.DATINI)))
-- MONTA HISTÓRICO DE CENTRO DE CUSTO --
INNER JOIN R038HCC HCC ON HCC.NUMEMP = SIH.NUMEMP AND
HCC.TIPCOL = SIH.TIPCOL AND
HCC.NUMCAD = SIH.NUMCAD AND
HCC.DATALT =(SELECT MAX(HCC_2.DATALT)
FROM R038HCC HCC_2
WHERE HCC_2.NUMEMP = SIH.NUMEMP AND
HCC_2.TIPCOL = SIH.TIPCOL AND
HCC_2.NUMCAD = SIH.NUMCAD AND
HCC_2.DATALT<= SIH.DATINI)
-- BUSCA CENTRO DE CUSTO DO COLABORADOR --
INNER JOIN R018CCU CCU ON CCU.CODCCU = HCC.CODCCU
-- MONTA HISTÓRICO DE SINDICATO --
INNER JOIN R038HSI HSI ON HSI.NUMEMP = SIH.NUMEMP AND
HSI.TIPCOL = SIH.TIPCOL AND
HSI.NUMCAD = SIH.NUMCAD AND
HSI.DATALT =(SELECT MAX(HSI_2.DATALT)
FROM R038HSI HSI_2
WHERE HSI_2.NUMEMP = SIH.NUMEMP AND
HSI_2.TIPCOL = SIH.TIPCOL AND
HSI_2.NUMCAD = SIH.NUMCAD AND
HSI_2.DATALT<= SIH.DATINI)
-- BUSCA CADASTRO DO SINDICATO --
INNER JOIN R014SIN SIN ON SIN.CODSIN = HSI.CODSIN
-- BUSCA CADASTRO DE MOTIVO PARA A SOLICITAÇÃO --
INNER JOIN R010MOT MOT ON MOT.MOTSIT = SIH.USU_CODMOT
-- MONTA HISTÓRICO DE ESCALA --
INNER JOIN R038HES HES ON HES.NUMEMP = SIH.NUMEMP AND
HES.TIPCOL = SIH.TIPCOL AND
HES.NUMCAD = SIH.NUMCAD AND
HES.DATALT =(SELECT MAX(DATALT)
FROM R038HES
WHERE NUMEMP = SIH.NUMEMP AND
TIPCOL = SIH.TIPCOL AND
NUMCAD = SIH.NUMCAD AND
DATALT<= SIH.DATINI)
-- BUSCA O HORARIO APARTIR DA ESCALA --
INNER JOIN R006HOR HOR ON HOR.CODESC = HES.CODESC AND
HOR.SEQREG = (TO_CHAR (SIH.DATINI, 'D'))
-- BUSCA CADASTRO DA ESCALA --
INNER JOIN R006ESC ESC ON ESC.CODESC = HES.CODESC
-- BUSCA A FAIXA HORARIA APARTIR DA ESCALA --
FULL OUTER JOIN R004MHR MHR ON MHR.CODHOR = HOR.CODHOR AND
MHR.USOBAT = 1 AND
((MHR.SEQMAR = 1 AND
MHR.HORBAT = SIH.HORFIM) OR
(MHR.SEQMAR > 1 AND
MHR.HORBAT = SIH.HORINI))
-- VERIFICA FERIADO NO DIA DA SOLICITAÇÃO --
FULL OUTER JOIN R002FEC FEC ON FEC.DATFER = SIH.DATINI AND
CODFER IN (SELECT FIL.TABFED
FROM R030FIL FIL
WHERE FIL.NUMEMP = FUN.NUMEMP AND
FIL.CODFIL IN (SELECT HFI.CODFIL
FROM R038HFI HFI
WHERE HFI.NUMEMP = FUN.NUMEMP AND
HFI.TIPCOL = FUN.TIPCOL AND
HFI.NUMCAD = FUN.NUMCAD AND
HFI.DATALT = (SELECT MAX(E.DATALT)
FROM R038HFI E
WHERE E.NUMEMP = FUN.NUMEMP AND
E.TIPCOL = FUN.TIPCOL AND
E.NUMCAD = FUN.NUMCAD AND
E.DATALT<= SIH.DATINI)))
-- BUSCA ATE 4 MARCAÇÕES DENTRO DA SOLICITAÇÃO --
FULL OUTER JOIN R070ACC ACC1 ON ACC1.NUMCAD = SIH.NUMCAD AND
ACC1.DATACC = SIH.DATINI AND
ACC1.HORACC BETWEEN SIH.HORINI-10 AND SIH.HORFIM+10
FULL OUTER JOIN R070ACC ACC2 ON ACC2.NUMCAD = SIH.NUMCAD AND
ACC2.DATACC = SIH.DATINI AND
ACC2.HORACC BETWEEN SIH.HORINI-10 AND SIH.HORFIM+10 AND
ACC2.HORACC > ACC1.HORACC
FULL OUTER JOIN R070ACC ACC3 ON ACC3.NUMCAD = SIH.NUMCAD AND
ACC3.DATACC = SIH.DATINI AND
ACC3.HORACC BETWEEN SIH.HORINI-10 AND SIH.HORFIM+10 AND
ACC3.HORACC > ACC2.HORACC
FULL OUTER JOIN R070ACC ACC4 ON ACC4.NUMCAD = SIH.NUMCAD AND
ACC4.DATACC = SIH.DATINI AND
ACC4.HORACC BETWEEN SIH.HORINI-10 AND SIH.HORFIM+10 AND
ACC4.HORACC > ACC3.HORACC
GROUP BY
EMP.NUMEMP,
EMP.NOMEMP,
CCU.CODCCU,
CCU.NOMCCU,
MOT.MOTSIT,
MOT.DESMSI,
SIH.TIPCOL,
FUN.NUMCAD,
FUN.NOMFUN,
SIH.DATINI,
SIH.DATFIM,
SIH.HORINI,
SIH.HORFIM,
MHR.SEQMAR,
SIH.USU_APRN01
ORDER BY
EMP.NUMEMP,
EMP.NOMEMP,
CCU.CODCCU,
CCU.NOMCCU,
MOT.MOTSIT,
MOT.DESMSI,
SIH.TIPCOL,
FUN.NUMCAD,
FUN.NOMFUN,
SIH.DATINI,
SIH.DATFIM,
SIH.HORINI,
SIH.HORFIM,
MHR.SEQMAR,
SIH.USU_APRN01
)
WHERE
DATINI BETWEEN '19022011' AND '19022011'
Quase sempre dá para melhorar uma query.
Mas esta query eu levaria um tempão só para tentar entender o que faz, para melhorar então ...
Explico,
Tenho uma tabela de solicitação para o colaborador,
SELECT
SIH.NUMCAD AS "CADASTRO DO COLABORADOR",
SIH.HORINI AS "INICIO DA SOLICITAÇÃO",
SIH.HORFIM AS "FINAL DA SOLICITAÇÃO"
FROM
R064SIH SIH
WHERE
SIH.DATINI = '19022011' AND
SIH.NUMCAD = 330
Resultado:
CADASTRO DO COLABORADOR / INICIO DA SOLICITAÇÃO / FINAL DA SOLICITAÇÃO
----------------------- --------------------- --------------------
330 350 870
1 row selected.
E uma tabela de acesso do colaborador
SELECT
ACC.NUMCAD AS "CADASTRO DO COLABORADOR",
ACC.HORACC AS "HORA DO ACESSO"
FROM
R070ACC ACC
WHERE
ACC.DATACC = '19022011' AND
ACC.NUMCAD = 330
Resultado:
CADASTRO DO COLABORADOR / HORA DO ACESSO
----------------------- --------------
330 355
330 606
330 626
330 862
4 rows selected.
Quero trazer estes 4 acessos em colunas junto da solicitação!
estou fazendo assim:
SELECT
SIH.NUMCAD AS "CAD COL",
SIH.HORINI AS "INI SOL",
SIH.HORFIM AS "FIN SOL",
MIN(ACC1.HORACC) AS "1º ACESSO",
MIN(ACC2.HORACC) AS "2º ACESSO",
MIN(ACC3.HORACC) AS "3º ACESSO",
MAX(ACC4.HORACC) AS "ULT ACESSO"
FROM
R064SIH SIH
FULL OUTER JOIN R070ACC ACC1 ON ACC1.NUMCAD = SIH.NUMCAD AND
ACC1.DATACC = SIH.DATINI AND
ACC1.HORACC BETWEEN SIH.HORINI AND SIH.HORFIM
FULL OUTER JOIN R070ACC ACC2 ON ACC2.NUMCAD = SIH.NUMCAD AND
ACC2.DATACC = SIH.DATINI AND
ACC2.HORACC BETWEEN SIH.HORINI AND SIH.HORFIM AND
ACC2.HORACC > ACC1.HORACC
FULL OUTER JOIN R070ACC ACC3 ON ACC3.NUMCAD = SIH.NUMCAD AND
ACC3.DATACC = SIH.DATINI AND
ACC3.HORACC BETWEEN SIH.HORINI AND SIH.HORFIM AND
ACC3.HORACC > ACC2.HORACC
FULL OUTER JOIN R070ACC ACC4 ON ACC4.NUMCAD = SIH.NUMCAD AND
ACC4.DATACC = SIH.DATINI AND
ACC4.HORACC BETWEEN SIH.HORINI AND SIH.HORFIM
WHERE
SIH.DATINI = '19022011' AND
SIH.NUMCAD = 330
GROUP BY
SIH.NUMCAD,
SIH.HORINI,
SIH.HORFIM
Resultado:
CAD COL / INI SOL / FIN SOL / 1º ACESSO / 2º ACESSO / 3º ACESSO / ULT ACESSO
---------- ---------- ---------- ---------- ---------- ---------- ----------
330 350 870 355 606 626 862
1 row selected.
Por adicionar 4x a tabela R070ACC ficou muito lento, existe outra forma de trazer os acessos adicionando uma unica vez a tabela?
Levando em conta o relacionamento entre as duas,
SELECT
SIH.NUMCAD AS "CAD COL",
SIH.HORINI AS "INI SOL",
SIH.HORFIM AS "FIN SOL",
ACC.HORACC AS "ACESSO"
FROM
R064SIH SIH,
R070ACC ACC
WHERE
SIH.DATINI = '19022011' AND
SIH.NUMCAD = 330 AND
ACC.NUMCAD = SIH.NUMCAD AND
ACC.DATACC = SIH.DATINI AND
ACC.HORACC BETWEEN SIH.HORINI AND SIH.HORFIM
Resultado:
CAD COL INI SOL FIN SOL ACESSO
---------- ---------- ---------- ----------
330 350 870 355
330 350 870 606
330 350 870 626
330 350 870 862
4 rows selected.
1)
Talvez este
SELECT
SIH.NUMCAD AS "CAD COL",
SIH.HORINI AS "INI SOL",
SIH.HORFIM AS "FIN SOL",
MIN(ACC1.HORACC) AS "1º ACESSO",
...
MAX(ACC4.HORACC) AS "ULT ACESSO"
FROM
R064SIH SIH
FULL OUTER JOIN R070ACC ACC1 ON ACC1.NUMCAD = SIH.NUMCAD AND
ACC1.DATACC = SIH.DATINI AND
ACC1.HORACC BETWEEN SIH.HORINI AND SIH.HORFIM
...
FULL OUTER JOIN R070ACC ACC4 ON ACC4.NUMCAD = SIH.NUMCAD AND
ACC4.DATACC = SIH.DATINI AND
ACC4.HORACC BETWEEN SIH.HORINI AND SIH.HORFIM
WHERE
SIH.DATINI = '19022011' AND
SIH.NUMCAD = 330
GROUP BY
SIH.NUMCAD,
SIH.HORINI,
SIH.HORFIM
Usando CASE para as regras do WHERE, tipo o
ACC4.HORACC BETWEEN SIH.HORINI AND SIH.HORFIM
Seria um join ao invés de quatro.
--
2)
A tabela R070ACC tem índices pela busca que é feita (NUMCAD,DATACC,HORACC) ?
--
SELECT
SIH.NUMCAD AS "CAD COL",
SIH.HORINI AS "INI SOL",
SIH.HORFIM AS "FIN SOL",
ACC.HORACC AS "ACESSO"
FROM
R064SIH SIH,
R070ACC ACC
WHERE
SIH.DATINI = '19022011' AND
SIH.NUMCAD = 330 AND
ACC.NUMCAD = SIH.NUMCAD AND
ACC.DATACC = SIH.DATINI AND
ACC.HORACC BETWEEN SIH.HORINI AND SIH.HORFIM
Resultado:
CAD COL | INI SOL | FIN SOL | ACESSO
-------------------------------------
330 350 870 355
330 350 870 606
330 350 870 626
330 350 870 862
4 rows selected.
Basicamente é isso que eu preciso^^^^. só que agrupado em uma linha.
note que tenho 4 acessos para um mesmo colaborador e solicitação.
a ideia é agrupar o cadastro, hora inicial e hora final...
quando faço isto consigo retornar uma unica linha com a solicitação. também consigo pegar em colunas o 355(MIN(acesso) sendo a primeira) e o 862(MAX(acesso) sendo a ultima).
perco os dois do meio (606,626). consegui pegar os 4 com os Join's, mas ficou feio!
se utilizar o CASE estaria filtrando, e o resultado seria um ou outro. certo?
não tenho índice para a tabela r070acc
não tenho índice para a tabela r070acc
O gargalho pode ser este.
--
CASE
SELECT
SIH.NUMCAD AS "CAD COL",
SIH.HORINI AS "INI SOL",
SIH.HORFIM AS "FIN SOL",
MIN((CASE WHEN ACC.HORACC BETWEEN SIH.HORINI AND SIH.HORFIM THEN ACC.HORACC ELSE NULL END)) AS "1º ACESSO",
/*REPLICAR OS DEMAIS CASOS*/
FROM
R064SIH SIH
FULL OUTER JOIN R070ACC ACC1 ON ACC1.NUMCAD = SIH.NUMCAD AND
ACC1.DATACC = SIH.DATINI
WHERE
SIH.DATINI = '19022011' AND
SIH.NUMCAD = 330
GROUP BY
SIH.NUMCAD,
SIH.HORINI,
SIH.HORFIMSELECT
SIH.NUMCAD AS "CAD COL",
SIH.HORINI AS "INI SOL",
SIH.HORFIM AS "FIN SOL",
MIN(ACC.HORACC) AS "1º ACESSO",
MIN((CASE WHEN ACC.HORACC > 355 THEN ACC.HORACC END)) AS "2º ACESSO",
MAX((CASE WHEN ACC.HORACC < 862 THEN ACC.HORACC END)) AS "3º ACESSO",
MAX(ACC.HORACC) AS "4º ACESSO"
FROM
R064SIH SIH
FULL OUTER JOIN R070ACC ACC ON ACC.NUMCAD = SIH.NUMCAD AND
ACC.DATACC = SIH.DATINI AND
ACC.HORACC BETWEEN SIH.HORINI AND SIH.HORFIM
WHERE
SIH.DATINI = '19022011' AND
SIH.NUMCAD = 330
GROUP BY
SIH.NUMCAD,
SIH.HORINI,
SIH.HORFIM
RESULTADO:
CAD COL INI SOL FIN SOL 1º ACESSO 2º ACESSO 3º ACESSO 4º ACESSO
---------- ---------- ---------- ---------- ---------- ---------- ----------
330 350 870 355 606 626 862
1 row selected.
consegui adaptar +/- o que você propôs, e trouxe certo ;), meu problema agora é para colocar o minimo((355) primeiro acesso) e o maximo((862) ultimo acesso),
dentro dos CASE's de forma dinamica! Alguma sugestão?
meu problema agora é para colocar o minimo((355) primeiro acesso) e o maximo((862) ultimo acesso),dentro dos CASE's de forma dinamica!
Desculpe não entendi.
MIN(ACC.HORACC) AS "1º ACESSO",
MIN((CASE WHEN ACC.HORACC > 355 THEN ACC.HORACC END)) AS "2º ACESSO",
MAX((CASE WHEN ACC.HORACC < 862 THEN ACC.HORACC END)) AS "3º ACESSO",
MAX(ACC.HORACC) AS "4º ACESSO"
note que no case, para testar coloquei o valor fixo, como substituiria pelo menor valor do acesso no primeiro caso(355),
e o maior no segundo(862).
Poderia ser uma FUNCTION que retornaria estes valores
ou
Dependendo da aplicação os valores seriam obtidos via outra query (mais simples) e passados via paramêtro.
Ok,
também estive pensando nisto, irei tentar resolver assim...
quando ficar pronto retorno com o resultado.
muito grato pela atenção! é de grande valor!!!
SELECT CAMPO1 , (CAMPO1 + 12) CAMPO2
FROM
(
FROM USER_TABLES
) WHERE ROWNUM < 3
CAMPO1 CAMPO2
---------------------- ----------------------
21 33
11 23