Tagged: oracle
- This topic has 2 replies, 2 voices, and was last updated 4 years, 6 months ago by José Laurindo Chiappa.
-
AuthorPosts
-
11 de maio de 2020 at 9:38 am #145987LHCParticipant
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_FILIALErro:
ORA-00907: parêntese direito não encontrado
00907. 00000 – “missing right parenthesis”
*Cause:
*Action:
Erro na linha: 2 Coluna: 3111 de maio de 2020 at 2:01 pm #145988José Laurindo ChiappaModeratorBlz ? 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
11 de maio de 2020 at 2:41 pm #145989José Laurindo ChiappaModeratorOutra 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
-
AuthorPosts
- You must be logged in to reply to this topic.