- Este tópico contém 26 respostas, 5 vozes e foi atualizado pela última vez 16 anos, 4 meses atrás por
Tiago_BB.
-
AutorPosts
-
3 de novembro de 2009 às 9:17 pm #90683
Tiago_BB
Participanteok.
MUITO obrigado pela ajuda pessoal.
😀
3 de novembro de 2009 às 9:28 pm #90684hudsona
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!!!
3 de novembro de 2009 às 11:24 pm #90687Tiago_BB
ParticipantePessoal, 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 – feriadoBeleza… e o campo dia_semana_tab pode ser:
1-segunda
2- terça
3- quarta
4-quinta
5-sexta
6-sábado
7-domingoO 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á!!!
4 de novembro de 2009 às 3:05 pm #90691Tiago_BB
ParticipanteFicou meio confuso a explicação?
🙂
4 de novembro de 2009 às 3:49 pm #90692Tiago_BB
ParticipanteEntaum 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.
4 de novembro de 2009 às 8:20 pm #90708burga
ParticipanteOi 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.
4 de novembro de 2009 às 8:37 pm #90712Tiago_BB
ParticipanteOla 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.
4 de novembro de 2009 às 8:48 pm #90713Tiago_BB
ParticipanteResolvi.
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?
😆
4 de novembro de 2009 às 9:02 pm #90715burga
Participanteacho 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.
4 de novembro de 2009 às 9:17 pm #90721Tiago_BB
Participanteok.
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.
4 de novembro de 2009 às 9:48 pm #90724burga
ParticipanteOi 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.
4 de novembro de 2009 às 10:15 pm #90726Tiago_BB
ParticipanteJa tinha feito.
Fiz sem a cláusula FROM DUAL!!
Funcionou.
Agradeço pela ajuda!!!
Obrigado!!!
😀
-
AutorPosts
- Você deve fazer login para responder a este tópico.