Dúvida.

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
linoweb
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Dom, 24 Mai 2009 11:44 am
Localização: Fortaleza

Olá pessoal estou iniciando na programação PL/SQL. Tenho que criar um relatório que me mostre a quantidade Total de OS’s (Ordens de Serviço) e um percentual discriminado por setor. Criei o seguinte código para determinar a quantidade individual por setor. Mais não consigo elaborar um count(*) que me mostre em uma outra coluna, o total (soma de todos os setores). Ai vai o código que elaborei: se conhecerem uma forma mais simples de realizar essa consulta, fico muito grato.... Valeu.

Selecionar tudo

SELECT TABELA.MAQUINA,
       TABELA.TIPO_MANU,
       SUM(MANUTENCAO) MANUTENCAO,
       SUM(ELETRICA) ELETRICA,
       SUM(ELETRONICA) ELETRONICA,
       SUM(UTILIDADES) UTILIDADES,
       SUM(OFICINA) OFICINA

  FROM (SELECT APLIC.TAG MAQUINA,
               TIPMANUT.DESCRICAO TIPO_MANU,
               NVL(COUNT(ORDSERV.TAG), 0) MANUTENCAO,
               0 ELETRICA,
               0 ELETRONICA,
               0 UTILIDADES,
               0 OFICINA
        
          FROM ORDSERV, APLIC, TIPMANUT, SETEXE
        
         WHERE ORDSERV.DATPRO BETWEEN '01-jan-09' AND '30-jan-09'
           AND ORDSERV.CODAPL = APLIC.CODAPL
           AND ORDSERV.CODEMP_2 = TIPMANUT.CODEMP
           AND ORDSERV.CODTIPMAN = TIPMANUT.CODTIPMAN
           AND ORDSERV.CODEMP_4 = SETEXE.CODEMP
           AND ORDSERV.CODSET = SETEXE.CODSET
           AND ORDSERV.STATORD = 'F'
           AND SETEXE.CODSET = 22
        
         GROUP BY APLIC.TAG, TIPMANUT.DESCRICAO
        
        UNION
        
        SELECT APLIC.TAG MAQUINA,
               TIPMANUT.DESCRICAO TIPO_MANU,
               0 MANUTENCAO,
               NVL(COUNT(ORDSERV.TAG), 0) ELETRICA,
               0 ELETRONICA,
               0 UTILIDADES,
               0 OFICINA
        
          FROM ORDSERV, APLIC, TIPMANUT, SETEXE
        
         WHERE ORDSERV.DATPRO BETWEEN '01-jan-09' AND '30-jan-09'
           AND ORDSERV.CODAPL = APLIC.CODAPL
           AND ORDSERV.CODEMP_2 = TIPMANUT.CODEMP
           AND ORDSERV.CODTIPMAN = TIPMANUT.CODTIPMAN
           AND ORDSERV.CODEMP_4 = SETEXE.CODEMP
           AND ORDSERV.CODSET = SETEXE.CODSET
           AND ORDSERV.STATORD = 'F'
           AND SETEXE.CODSET = 21
        
         GROUP BY APLIC.TAG, TIPMANUT.DESCRICAO
        
        UNION
        
        SELECT APLIC.TAG MAQUINA,
               TIPMANUT.DESCRICAO TIPO_MANU,
               0 MANUTENCAO,
               0 ELETRICA,
               NVL(COUNT(ORDSERV.TAG), 0) ELETRONICA,
               0 UTILIDADES,
               0 OFICINA
        
          FROM ORDSERV, APLIC, TIPMANUT, SETEXE
        
         WHERE ORDSERV.DATPRO BETWEEN '01-jan-09' AND '30-jan-09'
           AND ORDSERV.CODAPL = APLIC.CODAPL
           AND ORDSERV.CODEMP_2 = TIPMANUT.CODEMP
           AND ORDSERV.CODTIPMAN = TIPMANUT.CODTIPMAN
           AND ORDSERV.CODEMP_4 = SETEXE.CODEMP
           AND ORDSERV.CODSET = SETEXE.CODSET
           AND ORDSERV.STATORD = 'F'
           AND SETEXE.CODSET = 27
         GROUP BY APLIC.TAG, TIPMANUT.DESCRICAO
        
        UNION
        
        SELECT APLIC.TAG MAQUINA,
               TIPMANUT.DESCRICAO TIPO_MANU,
               0 MANUTENCAO,
               0 ELETRICA,
               0 ELETRONICA,
               NVL(COUNT(ORDSERV.TAG), 0) UTILIDADES,
               0 OFICINA
        
          FROM ORDSERV, APLIC, TIPMANUT, SETEXE
        
         WHERE ORDSERV.DATPRO BETWEEN '01-jan-09' AND '30-jan-09'
           AND ORDSERV.CODAPL = APLIC.CODAPL
           AND ORDSERV.CODEMP_2 = TIPMANUT.CODEMP
           AND ORDSERV.CODTIPMAN = TIPMANUT.CODTIPMAN
           AND ORDSERV.CODEMP_4 = SETEXE.CODEMP
           AND ORDSERV.CODSET = SETEXE.CODSET
           AND ORDSERV.STATORD = 'F'
           AND SETEXE.CODSET = 23
        
         GROUP BY APLIC.TAG, TIPMANUT.DESCRICAO
        
        UNION
        
        SELECT APLIC.TAG MAQUINA,
               TIPMANUT.DESCRICAO TIPO_MANU,
               0 MANUTENCAO,
               0 ELETRICA,
               0 ELETRONICA,
               0 UTILIDADES,
               NVL(COUNT(ORDSERV.TAG), 0) OFICINA
        
          FROM ORDSERV, APLIC, TIPMANUT, SETEXE
        
         WHERE ORDSERV.DATPRO BETWEEN '01-jan-09' AND '30-jan-09'
           AND ORDSERV.CODAPL = APLIC.CODAPL
           AND ORDSERV.CODEMP_2 = TIPMANUT.CODEMP
           AND ORDSERV.CODTIPMAN = TIPMANUT.CODTIPMAN
           AND ORDSERV.CODEMP_4 = SETEXE.CODEMP
           AND ORDSERV.CODSET = SETEXE.CODSET
           AND ORDSERV.STATORD = 'F'
           AND SETEXE.CODSET = 26
        
         GROUP BY APLIC.TAG, TIPMANUT.DESCRICAO) TABELA
 GROUP BY TABELA.MAQUINA, TABELA.TIPO_MANU
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Tópico movido para forum de SQL.
Avatar do usuário
anderson
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 06 Jun 2005 1:08 pm
Localização: Toledo - PR
Contato:
Anderson Nuernberg
---

primeiro, segue uma maneira de otimizar um pouco, tente a consulta abaixo.

Selecionar tudo

SELECT APLIC.TAG MAQUINA,
       TIPMANUT.DESCRICAO TIPO_MANU,
       CASE
       WHEN SETEXE.CODSET = 22 THEN 'MANUTENCAO'
       WHEN SETEXE.CODSET = 21 THEN 'ELETRICA'
       WHEN SETEXE.CODSET = 27 THEN 'ELETRONICA'
       WHEN SETEXE.CODSET = 23 THEN 'UTILIDADES'
       WHEN SETEXE.CODSET = 26 THEN 'OFICINA'
       END SETOR,
       NVL(COUNT(ORDSERV.TAG), 0) QUANTIDADE
  FROM ORDSERV, APLIC, TIPMANUT, SETEXE
 WHERE ORDSERV.DATPRO BETWEEN '01-jan-09' AND '30-jan-09'
   AND ORDSERV.CODAPL = APLIC.CODAPL
   AND ORDSERV.CODEMP_2 = TIPMANUT.CODEMP
   AND ORDSERV.CODTIPMAN = TIPMANUT.CODTIPMAN
   AND ORDSERV.CODEMP_4 = SETEXE.CODEMP
   AND ORDSERV.CODSET = SETEXE.CODSET
   AND ORDSERV.STATORD = 'F'
   AND SETEXE.CODSET IN (21,22,23,26,27)
 GROUP BY APLIC.TAG, TIPMANUT.DESCRICAO, SETEXE.CODSET
veja ai se funciona.
marcelo_nunes
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 08 Set 2008 7:35 pm
Localização: Ribeirão Preto - SP
Marcelo Nunes
Analista/Desenvolvedor Oracle

Cara, existe uma função no oracle para ser utilizada no group by que se chama "ROLLUP".

Dá uma ulhada nesse tópico, acho que pode ser útil nesse caso...

http://glufke.net/oracle/viewtopic.php?t=304
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 16 visitantes