Ir para conteúdo

POWERED BY:

Arquivado

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

felp10

Reutilização de COLUNA NOMEADA

Recommended Posts

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

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

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

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

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

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

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

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

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

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

×

Informação importante

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