Pular para o conteúdo

Tagged: 

  • This topic has 2 replies, 2 voices, and was last updated 4 years, 6 months ago by Avatar photoJosé Laurindo Chiappa.
Viewing 3 posts - 1 through 3 (of 3 total)
  • Author
    Posts
  • #145987
    Avatar de LHCLHC
    Participant

      Senhores bom dia estou iniciando agora e estou com dificuldades em entender o que está errado na minha consulta, poderiam me ajudar?

      Resumo: basicamente seleciona a tabela de cadastro de funcionarios me retorna  quantidade total e seleciona a mesma tabela pra saber quem esta de ferias quantidade e quem esta afastado em quantidade.

      Código:

      SELECT RA_FILIAL, COUNT() AS TOTAL,
      (SELECT COUNT (
      ) FROM SRA310 AS FSRA WHERE FSRA.RA_SITFOLH <> ‘D’ AND FSRA.RA_SITFOLH = ‘F’ AND FSRA.D_E_L_E_T_ = ‘ ‘ AND FSRA.RA_FILIAL = SRA310.RA_FILIAL) AS FERIAS,
      (SELECT COUNT (*) FROM SRA310 AS ASRA WHERE ASRA.RA_SITFOLH <> ‘D’ AND ASRA.RA_SITFOLH = ‘A’ AND ASRA.D_E_L_E_T_ = ‘ ‘ AND ASRA.RA_FILIAL = SRA.RA_FILIAL) AS AFAST
      FROM SRA310
      WHERE RA_SITFOLH <> ‘D’ AND SRA310.D_E_L_E_T_ = ‘ ‘
      GROUP BY RA_FILIAL
      ORDER BY RA_FILIAL

       

      Erro:

      ORA-00907: parêntese direito não encontrado
      00907. 00000 – “missing right parenthesis”
      *Cause:
      *Action:
      Erro na linha: 2 Coluna: 31

      #145988
      Avatar photoJosé Laurindo Chiappa
      Moderator

        Blz ? Então, sem ter as suas tabelas fica meio BEM difícil fazer qquer debug mas numa batida de olho o que me chama a atenção são esses COUNT() que vc tem no meio do seu código – em princípio COUNT sem argumento algum Não é Válido : OU vc faz COUNT(*) se quiser contar registros sem indicar coluna OU vc faz COUNT(nomedeumacoluna) , COUNT() q nem vc escreveu não é aceito afaik….

        Abraços,

        Chiappa

        #145989
        Avatar photoJosé Laurindo Chiappa
        Moderator

          Outra coisa que salta aos olhos é que na coluna calculada que vc chama de AFAST vc escreveu :

           (SELECT COUNT (*) FROM SRA310 AS ASRA
          WHERE ASRA.RA_SITFOLH <> 'D'
          AND ASRA.RA_SITFOLH = 'A'
          AND ASRA.D_E_L_E_T_ = ' '
          AND ASRA.RA_FILIAL = SRA.RA_FILIAL
          ) AS AFAST
          

          ==> Ta vendo essa linha com :

          AND ASRA.RA_FILIAL = SRA.RA_FILIAL

          AONDE que vc definiu em algum lugar esse alias SRA ??? SE vc não indicar Claramente QUAL tabela deve ser acionada com esse alis SRA pra encontrar a coluna RA_FILIAL, o Oracle COM CERTEZA NÃO VAI PODER ENCONTRAR….

          E só comentando, esse código que vc propôs me parece ser bem RUIM : acessar a mesma tabela (essa SRA310 no caso) várias e várias vezes só pra Obter uma contagem de registros que obedecem à uma condição é Amadorístico e Ineficiente, em especial se a tabela for grande, a performance disso seria Horrorosamente lenta, além da Legibilidade desse código ser quase nula…
          Na linguagem SQL, para vc obter um “IF”, ie, uma comparação que pode ou não ser verdadeira, pra isso nós temos o comando CASE…. Só para exemplificar, usando os dados de uma tabela-teste que tenho aqui, vamos dizer que eu queira ter uma coluna com contagem TOTAL dos registros da minha tabela EMP, uma contagem que conte apenas os empregados que ganham mais de 1000 e uma outra contagem de empregados que estão no Depto , e finalmente uma outra contagem dos empregados com a função de SALESMAN, tudo isso agrupando por departamento – numa só leitura da tabela, eu faria :

          scott@DESENV:SQL>SELECT DEPTNO, COUNT(*) as TOTAL_NO_DEPTO,
          2 SUM(CASE WHEN SAL > 1000 then 1 else 0 end) as QTD_EMPS_QUE_GANHAM_MUITO,
          3 SUM(CASE WHEN JOB = 'SALESMAN'then 1 else 0 end) as QTD_SALESMAN_NO_DEPTO
          4 FROM EMP
          5 GROUP BY DEPTNO
          6* ORDER BY DEPTNO;
          
          DEPTNO TOTAL_NO_DEPTO QTD_EMPS_QUE_GANHAM_MUITO QTD_SALESMAN_NO_DEPTO
          ---------- -------------- ------------------------- ---------------------
          10 3 3 0
          20 6 5 1
          30 7 6 4
          
          scott@DESENV:SQL>

          ==> Realmente, se conferirmos os dados :

          scott@DESENV:SQL>select deptno, empno, job, sal from emp order by 1,3,4;
          
          DEPTNO EMPNO JOB SAL
          ---------- ---------- --------- ----------
          10 7934 CLERK 1300
          10 7782 MANAGER 2450
          10 7839 PRESIDENT 5000
          
          20 7788 ANALYST 3000
          20 7902 ANALYST 3000
          20 7369 CLERK 800
          20 7876 CLERK 1100
          20 7566 MANAGER 2975
          20 7522 SALESMAN 1260
          
          30 7523 ANALYST 1260
          30 7900 CLERK 950
          30 7698 MANAGER 2850
          30 7521 SALESMAN 1260
          30 7654 SALESMAN 1260
          30 7844 SALESMAN 1500
          30 7499 SALESMAN 1600
          
          16 linhas selecionadas.
          
          scott@DESENV:SQL>

          ==> Fica Patente que temos mesmo 3 empregados no Depto 10, 6 no 20 e 7 no Deptno 30, que no Depto 10 temos 3 caras que ganham mais de 1000 mas nenhum SALESMAN,
          no DEPTO 20 só temos um SALESMAN e temos 5 empregados que ganham muito, E no depto 30 temos 4 SALESMAN e 6 caras que ganham mais de 1000….
          Okdoc ?? Não que essa técnica que demonstrei seja a SOLUÇÃO final, única E Definitiva para se obter Totais/Contagens Condicionais na mesma tabela, mas com CERTEZA eu Acredito que deve SIM ser melhor do que essa sua de ficar lendo e lendo e relendo a mesma tabela N vezes….

          Abraços,

          Chiappa

        Viewing 3 posts - 1 through 3 (of 3 total)
        • You must be logged in to reply to this topic.
        plugins premium WordPress