Pular para o conteúdo
  • Este tópico contém 6 respostas, 4 vozes e foi atualizado pela última vez 16 anos, 7 meses atrás por santosclay.
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #82158
    rabbitvix
    Participante

      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
      TABELA

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

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

      #82159
      rabbitvix
      Participante

        Galera,

        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
        TABELA

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

        #82160
        fneukirchen
        Participante

          Rabbitvix,

          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

          #82161
          fneukirchen
          Participante

            Rabbitvix,

            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

            #82165
            Anônimo

              E 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 ) calc

              #82167
              rabbitvix
              Participante

                Valeu 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) calc

                #82168
                santosclay
                Participante

                  Olá 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.

                Visualizando 7 posts - 1 até 7 (de 7 do total)
                • Você deve fazer login para responder a este tópico.
                plugins premium WordPress