Como utilizar a função COUNT para calcular TOTAIS PARCIAIS em uma consulta

2 respostas
M

Pessoal,

Estou necessitando de ajuda na utilização da função COUNT do SQL para calcular totais parciais em uma consulta.
Eu trabalho com um sistema de controle acadêmico de pós-graduação de uma instituição de ensino superior.
O banco de dados que usamos é o PostgreSQL 8.3
Estão envolvidas as seguintes tabelas
Tabela de PROGRAMAS

Table: programas

CREATE TABLE programas
(
  prg_cod_programa numeric(3) NOT NULL,
  prg_descricao character varying(60) NOT NULL,
  CONSTRAINT programa_pk PRIMARY KEY (prg_cod_programa)
)
WITH (OIDS=FALSE);
ALTER TABLE programas OWNER TO role_posgrad;

Tabela de NIVEIS

-- Table: niveis

CREATE TABLE niveis
(
  niv_prg_cod_programa numeric(3) NOT NULL,
  niv_tipo numeric(1) NOT NULL,
  niv_turno numeric(1) NOT NULL,
  CONSTRAINT niveis_pk PRIMARY KEY (niv_prg_cod_programa, niv_tipo),
  CONSTRAINT fk_niveis_programas FOREIGN KEY (niv_prg_cod_programa)
      REFERENCES programas (prg_cod_programa) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE RESTRICT
)
WITH (OIDS=FALSE);
ALTER TABLE niveis OWNER TO role_posgrad;

Tabela de ALUNOS

-- Table: alunos
CREATE TABLE alunos
(
  alu_matricula character varying(9) NOT NULL,
  alu_ecu_niv_prg_cod_programa numeric(3) NOT NULL,
  alu_ecu_niv_tipo numeric(1) NOT NULL,
  alu_ecu_curriculo numeric(5),
  alu_arc_cod_area numeric(2),
  alu_campus numeric(1) NOT NULL,
  alu_situacao character(1) NOT NULL,
  alu_regime_dedicacao character(1),
  CONSTRAINT aluno_pk PRIMARY KEY (alu_matricula)
)
WITH (OIDS=FALSE);
ALTER TABLE alunos OWNER TO role_posgrad;

A consulta solicitada é :

Obtenha a quantidade de alunos matriculados em cada CAMPUS(alu_campus), agrupados
por PROGRAMA(alu_ecu_niv_prg_cod_programa), NIVEL(alu_ecu_niv_tipo) e TURNO(niv_turno).

Criei um esboço de query para resolver o problema acima, mas, infelizmente não está funcionando.
O código deste “esboço” é o seguinte

select p.prg_cod_programa, p.prg_descricao, a.alu_ecu_niv_tipo, n.niv_turno, count (a.alu_matricula)
from alunos a, niveis n, programas p
where a.alu_situacao = 'A'
and   a.alu_ecu_niv_prg_cod_programa = n.niv_prg_cod_programa
and   a.alu_ecu_niv_tipo = n.niv_tipo
group by p.prg_cod_programa, p.prg_descricao, a.alu_ecu_niv_tipo, n.niv_turno, a.alu_matricula
order by p.prg_cod_programa, a.alu_ecu_niv_tipo, n.niv_turno,a.alu_matricula

O count “acima” não está funcionando.
Eu necessito que o total parcial de alunos seja agrupado por PROGRAMA, NIVEL E TURNO.
Como devo utilizar a função COUNT para obter o resultado esperado ?
Terei que OBRIGATORIAMENTE usar o recurso de SUBCONSULTAS ?
Será que alguém poderia me ajudar ?

Agradece,

Max Carvalho

2 Respostas

P
select p.prg_cod_programa, p.prg_descricao, a.alu_ecu_niv_tipo, n.niv_turno, count (*)
from alunos a, niveis n, programas p
where a.alu_situacao = 'A'
and   a.alu_ecu_niv_prg_cod_programa = n.niv_prg_cod_programa
and   a.alu_ecu_niv_tipo = n.niv_tipo
and ... // falta a condição para o join entre as tabelas alunos e programas
group by 1,2,3,4
order by 1,3,4,5
M

Acho que consegui :

select distinct a.alu_campus, a.alu_ecu_niv_prg_cod_programa, p.prg_descricao, a.alu_ecu_niv_tipo, n.niv_turno, count(a.alu_matricula) as total
from alunos a, niveis n, programas p
where a.alu_situacao = 'A'
and   a.alu_ecu_niv_prg_cod_programa = n.niv_prg_cod_programa
and   a.alu_ecu_niv_tipo = n.niv_tipo
and   n.niv_prg_cod_programa = p.prg_cod_programa
group by a.alu_campus, a.alu_ecu_niv_prg_cod_programa, p.prg_descricao, a.alu_ecu_niv_tipo, n.niv_turno
order by a.alu_campus, a.alu_ecu_niv_prg_cod_programa, a.alu_ecu_niv_tipo, n.niv_turno

Não tenho muita experiência em consultas resultando em totais parciais.
Sei que isto é simples e é algo que acontece muito na prática, mas minha pouca experiência deve ter sido porque no meu caso nunca precisei usar muito.
Eu pensei que totais parciais usado COUNT só poderiam ser calculados utilizando-se subconsultas, mas, re-escrevendo a minha query com a ajuda do colega “pmlm”, acredito ter resolvido
o problema.
Como não tenho a base Oracle aqui em casa, eu criei as tabelas no Postgres e testei a consulta acima nesse banco. A princípio, o resultado obtido é o esperado.
O resultado só não ficou melhor organizado, porque desconheço no PostgreSQL, o equivalente a função decode() do Oracle.
Mas, como a base de produção onde a consulta irá extrair os dados é Oracle, segunda-feira vou re-escrever a query acima colocando decode e entregar os dados ao cliente.
Muito obrigado pela ajuda.
Valeu !!
[]'s
Max

Criado 2 de abril de 2010
Ultima resposta 3 de abr. de 2010
Respostas 2
Participantes 2