Pular para o conteúdo
Visualizando 12 posts - 16 até 27 (de 27 do total)
  • Autor
    Posts
  • #90683
    Tiago_BB
    Participante

      ok.

      MUITO obrigado pela ajuda pessoal.

      😀

      #90684
      hudsona
      Participante

        [quote=”Litz”:22f38sma]Só falta fazer o esquema do rownum no order by da subselect que esta no case..
        Dá uma olhada no desempenho também.. veja se esta legal…

        Vlw Leonardo Litz[/quote]

        Boa!!!

        #90687
        Tiago_BB
        Participante

          Pessoal, tem alguma coisa errada no script. 😕

          Esse script é uma regra.

          Pra começar; o campo FERIADO_TAB pode ser:

          0 – dia util
          1 e 2 – feriado

          Beleza… e o campo dia_semana_tab pode ser:
          1-segunda
          2- terça
          3- quarta
          4-quinta
          5-sexta
          6-sábado
          7-domingo

          O que acontece?

          Caso meu campo DIA_SEMANA_TAB no script seja 6 (sábado)…

          Vamos supor que eu entre com o dia 27/12/2009… deverá retornar o sábado anterior a essa data, caso esse sábado seja feriado, deverá retorna o dia útil anterior a ele, ou seja, vamos supor que dia 26/12/09 seja feriado… deverá retornar dia 25/12/05.

          Até ai ta funcionando… porém… dia 25 é feriado.. entaum preciso que me retorne o dia util anterior.. ou seja.. dia 24/12/2009.

          Ta devolvendo dia 25/12/09.. mesmo sendo feriado!!

          Espero ter sido claro..

          Agradeço desde já!!!

          #90691
          Tiago_BB
          Participante

            Ficou meio confuso a explicação?

            🙂

            #90692
            Tiago_BB
            Participante

              Entaum pessoal.

              tentei da seguinte forma:


              SELECT *
              FROM (SELECT CASE WHEN (FERIADO_TAB = 1 OR FERIADO_TAB = 2)
              THEN
              (SELECT *
              FROM(SELECT A.DATA_TAB
              FROM TAB A, TAB B
              WHERE A.DATA_TAB < B.DATA_TAB
              AND A.FERIADO_TAB = 0
              AND B.DIA_SEMANA_TAB = 6
              AND ROWNUM = 1
              ORDER BY A.DATA_TAB DESC))
              ELSE
              DATA_TAB
              END
              FROM TAB B
              WHERE CENTRO_CUSTO_TAB = 30400
              AND DATA_TAB < '20091228'
              AND DIA_SEMANA_TAB = 6
              AND ROWNUM = 1
              ORDER BY DATA_TAB DESC)
              WHERE ROWNUM = 1

              Porém, esta retornando 24/12/2010… e quero que retorne 24/12/2009.

              Alguma sugestão.

              atte.

              #90708
              burga
              Participante

                Oi Tiago, tenta isso:


                SELECT
                CASE
                WHEN (SELECT A.FERIADO_TAB
                FROM TAB A
                WHERE A.DATA_TAB < '20091228'
                AND A.DIA_SEMANA_TAB = 6
                AND A.CENTRO_CUSTO_TAB = 30400
                AND ROWNUM = 1
                ORDER BY A.DATA_TAB DESC) = 0
                THEN
                (SELECT A.DATA_TAB
                FROM TAB A
                WHERE A.DATA_TAB < '20091228'
                AND A.DIA_SEMANA_TAB = 6
                AND A.CENTRO_CUSTO_TAB = 30400
                AND ROWNUM = 1
                ORDER BY A.DATA_TAB DESC)
                ELSE
                (SELECT B.DATA_TAB
                FROM TAB B
                WHERE B.DATA_TAB < (SELECT A.DATA_TAB
                FROM TAB A
                WHERE A.DATA_TAB < '20091228'
                AND A.DIA_SEMANA_TAB = 6
                AND A.CENTRO_CUSTO_TAB = 30400
                AND ROWNUM = 1
                ORDER BY A.DATA_TAB DESC)
                AND B.FERIADO_TAB = 0
                AND B.CENTRO_CUSTO_TAB = 30400
                AND ROWNUM = 1
                ORDER BY B.DATA_TAB DESC)
                END
                FROM DUAL;

                Pode ter erros no código porque fiz correndo e não tenho como testar, mas aí você pode testar e arrumar. Deve ter jeito de melhorar ainda esse select, talvez usando a cláusula WITH.

                #90712
                Tiago_BB
                Participante

                  Ola burga.

                  Tentei mas da o seguinte erro na linha 9 (ORDER BY A.DATA_TAB DESC) = 0 ):

                  ORA-00936: missing expression

                  O que pode ser?

                  Agradeço a ajuda!

                  atte.

                  #90713
                  Tiago_BB
                  Participante

                    Resolvi.

                    Ficou da seguinte forma:


                    SELECT
                    CASE
                    WHEN (SELECT * FROM(SELECT A.FERIADO_TAB
                    FROM TAB A
                    WHERE A.DATA_TAB < '20091228'
                    AND A.DIA_SEMANA_TAB = 6
                    AND A.CENTRO_CUSTO_TAB = 30400
                    AND ROWNUM = 1
                    ORDER BY A.DATA_TAB DESC))=0
                    THEN
                    (SELECT * FROM(SELECT A.DATA_TAB
                    FROM TAB A
                    WHERE A.DATA_TAB < '20091228'
                    AND A.DIA_SEMANA_TAB = 6
                    AND A.CENTRO_CUSTO_TAB = 30400
                    AND ROWNUM = 1
                    ORDER BY A.DATA_TAB DESC) )
                    ELSE
                    (SELECT * FROM(SELECT B.DATA_TAB
                    FROM TAB B
                    WHERE B.DATA_TAB < (select * from(SELECT A.DATA_TAB
                    FROM TAB A
                    WHERE A.DATA_TAB < '20091228'
                    AND A.DIA_SEMANA_TAB = 6
                    AND A.CENTRO_CUSTO_TAB = 30400
                    AND ROWNUM = 1
                    ORDER BY A.DATA_TAB DESC))
                    AND B.FERIADO_TAB = 0
                    AND B.CENTRO_CUSTO_TAB = 30400
                    AND ROWNUM = 1
                    ORDER BY B.DATA_TAB DESC))
                    END
                    FROM DUAL

                    Não entendi esse FROM DUAL

                    Será que alguém pode me explicar?

                    😆

                    #90715
                    burga
                    Participante

                      acho que seria legal colocar a condição “rownum = 1” no select de fora (SELECT *).

                      Já tive problemas do oracle pegar os 10 primeiros registros (rownum <= 10) e depois ordená-los ao invés de ordená-los e depois pegar os registros.

                      Aqui tem alguns links sobre a tabela DUAL:

                      http://www.dba-oracle.com/sql/t_dual_table.htm

                      http://www.adp-gmbh.ch/ora/misc/dual.html

                      EDIT:

                      E se quiser melhorar, da uma olhhada na cláusula WITH, se essa consulta estiver retornando corretamente o que você quer.

                      #90721
                      Tiago_BB
                      Participante

                        ok.

                        MUITO Obrigado!!

                        E como ficaria essa query no SQL SERVER?

                        Fiz da seguinte forma:


                        SELECT TOP 1
                        CASE WHEN (SELECT TOP 1 A.FERIADO_TAB
                        FROM TAB A
                        WHERE A.DATA_TAB < '20080710'
                        AND A.DIA_SEMANA_TAB = 3
                        AND A.CENTRO_CUSTO_TAB = 30001
                        ORDER BY A.DATA_TAB DESC) = 0
                        THEN
                        (SELECT TOP 1 A.FERIADO_TAB
                        FROM TAB A
                        WHERE A.DATA_TAB < '20080710'
                        AND A.DIA_SEMANA_TAB = 3
                        AND A.CENTRO_CUSTO_TAB = 30001
                        ORDER BY A.DATA_TAB DESC)
                        ELSE
                        (SELECT TOP 1 B.DATA_TAB
                        FROM TAB B
                        WHERE B.DATA_TAB < (SELECT TOP 1 A.DATA_TAB
                        FROM TAB A
                        WHERE A.DATA_TAB < '20080710'
                        AND A.DIA_SEMANA_TAB = 3
                        AND A.CENTRO_CUSTO_TAB = 30001
                        ORDER BY A.DATA_TAB DESC)
                        AND B.FERIADO_TAB = 0
                        AND B.CENTRO_CUSTO_TAB = 30400
                        ORDER BY B.DATA_TAB DESC)
                        END
                        FROM DUAL

                        Ele reclama desse DUAL, da o seguinte erro:

                        “Msg 208, Level 16, State 1, Line 1
                        Invalid object name ‘DUAL’.”

                        Tentei rodar sem selecionar o FROM DUAL mas retorna NULL.

                        O que pode ser?

                        Agradeço muito a ajuda..

                        Atte.

                        #90724
                        burga
                        Participante

                          Oi Tiago,

                          No SQL Server é só você rodar a consulta sem a cláusula FROM mesmo.

                          Se mesmo assim quiser rodar com From DUAL, você terá que criar essa tabela no SQL Server:


                          CREATE TABLE DUAL
                          (
                          DUMMY varchar(1)
                          );

                          INSERT INTO DUAL (DUMMY) VALUES ('X');

                          Verifique se o resultado da consulta deve retornar algum registro no SQL Server, se existem os registros no banco. Se não existirem, está correto retornar NULL, senão é erro na consulta.

                          #90726
                          Tiago_BB
                          Participante

                            Ja tinha feito.

                            Fiz sem a cláusula FROM DUAL!!

                            Funcionou.

                            Agradeço pela ajuda!!!

                            Obrigado!!!

                            😀

                          Visualizando 12 posts - 16 até 27 (de 27 do total)
                          • Você deve fazer login para responder a este tópico.