felp10 0 Denunciar post Postado Novembro 28, 2011 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! Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Novembro 28, 2011 SELECT (CASE WHEN PCT_FREE = 10 THEN PCT_FREE + 1 ELSE PCT_FREE + 1 END) CAMPO1, (CAMPO1 + 12) CAMPO2 FROM USER_TABLES Erro na Linha de Comando:3 Coluna:8 Relatório de Erro: Erro de SQL: ORA-00904: "CAMPO1": identificador inválido 00904. 00000 - "%s: invalid identifier" *Cause: *Action: SELECT CAMPO1 , (CAMPO1 + 12) CAMPO2 FROM ( SELECT (CASE WHEN PCT_FREE = 10 THEN PCT_FREE + 1 ELSE PCT_FREE + 1 END) CAMPO1 FROM USER_TABLES ) WHERE ROWNUM < 3 CAMPO1 CAMPO2 ---------------------- ---------------------- 21 33 11 23 Compartilhar este post Link para o post Compartilhar em outros sites
felp10 0 Denunciar post Postado Novembro 28, 2011 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' Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Novembro 28, 2011 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 ... Compartilhar este post Link para o post Compartilhar em outros sites
felp10 0 Denunciar post Postado Novembro 28, 2011 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. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Novembro 28, 2011 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) ? -- Compartilhar este post Link para o post Compartilhar em outros sites
felp10 0 Denunciar post Postado Novembro 28, 2011 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 Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Novembro 28, 2011 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.HORFIM Compartilhar este post Link para o post Compartilhar em outros sites
felp10 0 Denunciar post Postado Novembro 29, 2011 SELECT 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? Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Novembro 29, 2011 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. Compartilhar este post Link para o post Compartilhar em outros sites
felp10 0 Denunciar post Postado Novembro 29, 2011 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). Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Novembro 29, 2011 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. Compartilhar este post Link para o post Compartilhar em outros sites
felp10 0 Denunciar post Postado Novembro 29, 2011 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!!! Compartilhar este post Link para o post Compartilhar em outros sites