- Este tópico contém 6 respostas, 4 vozes e foi atualizado pela última vez 16 anos, 7 meses atrás por santosclay.
-
AutorPosts
-
3 de julho de 2008 às 6:54 pm #82158rabbitvixParticipante
Fala Galera!
Estou pegado numa situação muito simples em outros SGBD mas que está me deixando louco no ORA!
Trabalho com SQL Server e para somar o resultado de expressões retornadas de um SELECT, simplesmente faço o seguinte:
SELECT
IIF(ISNULL(TABELA.QTDE1),O,TABELA.QTDE1) AS QTDE_A,
IIF(ISNULL(TABELA.QTDE2),O,TABELA.QTDE2) AS QTDE_B,
[QTDE_A]+[QTDE_B] AS QTDE_C
FROM
TABELAEstou migrando para o Oracle e transcrevi para:
SELECT
DECODE(TABELA.QTDE1,NULL,O,TABELA.QTDE1) AS QTDE_A,
DECODE(TABELA.QTDE2,NULL,O,TABELA.QTDE2) AS QTDE_B,
QTDE_A+QTDE_B AS QTDE_C
FROM
TABELASimples não?
Só que não roda!! Me retorna o erro ORA-00904: “QTDE_B” invalid identifier / Erro na linha 4 coluna 7
Não posso fazer operações com expressões calculadas em um SELECT no Oracle não?
Um abraço fraterno pra vocês! Fiquem na PAZ!!!
Em tempo: Sei que posso utilizar a função NVL(TABELA.QTDE1,0) para o resultado que desejo!
3 de julho de 2008 às 9:49 pm #82159rabbitvixParticipanteGalera,
Andei dando uma fuçada melhor nos manuais do Oracle sobre SQL e bati de frente com esta referência:
…
You can use a column alias, c_alias, to label the immediately preceding expression in the select list so that the column is displayed with a new heading. The alias effectively renames the select list item for the duration of the query. The alias can be used in the ORDER BY clause, but not other clauses in the query.
…Presumo então que não consiguirei fazer como gostaria e portanto, vou ter que utilizar uma solução ridícula como esta:
SELECT
DECODE(TABELA.QTDE1,NULL,O,TABELA.QTDE1) AS QTDE_A,
DECODE(TABELA.QTDE2,NULL,O,TABELA.QTDE2) AS QTDE_B,
DECODE(TABELA.QTDE1,NULL,O,TABELA.QTDE1)+DECODE(TABELA.QTDE2,NULL,O,TABELA.QTDE2) AS QTDE_C
FROM
TABELADigo ridícula não desmerecendo a ferramenta Oracle pela limitação de seu SQL, mas porque já estou imaginando o tamanho do SQL uma vez que terei que demonstrar e depois somar 33 (eu escrevi trinta e três) colunas de quantidades!!
Um abraço e obrigado pela oportunidade! Fiquem na PAZ!!!
4 de julho de 2008 às 3:03 am #82160fneukirchenParticipanteRabbitvix,
No resultado final da sua consulta há algum atributo além dos atributos numéricos que serão apresentados e envolvidos na soma?
F. Neukirchen
4 de julho de 2008 às 3:18 am #82161fneukirchenParticipanteRabbitvix,
Dei uma vasculhada rápida na minha memória e penso que mesmo conhecendo os demais atributos da consulta, conforme o meu post anterior, creio que não teremos uma escrita elegante podemos ter no MSSQL.
F. Neukirchen
4 de julho de 2008 às 4:04 pm #82165AnônimoE se vc fizesse :
Select calc.qtde_a, calc.qtde_b, QTDE_A+QTDE_B AS QTDE_C
from
(SELECT
DECODE(TABELA.QTDE1,NULL,O,TABELA.QTDE1) AS QTDE_A,
DECODE(TABELA.QTDE2,NULL,O,TABELA.QTDE2) AS QTDE_B
FROM TABELA ) calc4 de julho de 2008 às 5:26 pm #82167rabbitvixParticipanteValeu Vdrago!
Assim funfa numa boa e melhora bastante o meu SQL. Eu tinha resolvido fazendo duas Views, agora utilizarei somente uma!
Fiz algumas alterações utilizando o NVL e melhorou consideravelmente a performance já que são 51 colunas, 18 de dados e 33 de cálculos, num set de 23000 linhas!!
Select calc.qtde_a, calc.qtde_b, calc.qtde_a+calc.qtde_b AS qtde_c
from
(SELECT
NVL(QTDE1,0) AS QTDE_A,
NVL(QTDE2,0) AS QTDE_B
FROM
TABELA) calc4 de julho de 2008 às 9:44 pm #82168santosclayParticipanteOlá a todos!!!
Este post é apenas para apoiar o conceito exposto pelo rabbitvix.
Eu era usuário de SQL Server e a mais de 1 ano comecei a trabalho com Oracle.
Estive conversando com um amigo que possuí bons conhecimentos nas duas ferramentas e ele me explicou que o prepared statement do oracle e do SQL Server são diferentes.
Ao escrever uma clausula SQL no SQL Server a mesma é executada em background antes do usuário solicitar isso, para que esta seja validada. Com isso ele consegue mapear previamente os alias dos campos e utilizá-los em cálculos.
Já no Oracle não. Ele só executa a clausula SQL quando o usuário realmente solicita isso. Logo o que você queria fazer inicialmente não funcionava, pois sem a execução prévia da calusula, ele não consegue montar o mapeamento para os alias dos campos da consulta e realizar o calculo a partir daí.
Utilizando duas clausulas select uma dentro da outro funciona, pois a interna é executada primeiro, esta monta os alias dos campos e a externa consegue compreender e mapear os alias para assim efetuar o calculo.Eu não sou partidário de ficar levantado uma bandeira, acredito que existem várias formas de se oferecer uma solução.
Logo vou pesquisar mais sobre o assunto, pois imagino que essa facilidade oferecida pelo SQL Server deve gerar um esforço computacional que vale a pena saber quanto custa.
O Windows Vista é lindo, mas meu computador com 2GB ram, Xeon Dual Core e HD de160GB é avaliado em uma escala de compatibilidade para explorar todas as funcionalidades do SO com a nota 2,9 (em uma escala de 1 a 10).
Assim que eu tiver uma resposta retomo a questão.
Abraços Clayton.
-
AutorPosts
- Você deve fazer login para responder a este tópico.