Dificuldade em utilizar a função COUNT

9 respostas
M

Pessoal,

A tabela que segue é uma tabela de interrupções de matrícula em um sistema de controle acadêmico.

CREATE TABLE "PRPG"."INTERRUPCOES_MATRICULA" 
   (	"IMA_ALU_MATRICULA" VARCHAR2(9) NOT NULL ENABLE, 
	"IMA_SOI_TRA_NUM_TRANSACAO" NUMBER(9,0) NOT NULL ENABLE, 
	"IMA_ANO" NUMBER(4,0) NOT NULL ENABLE, 
	"IMA_PERIODO" NUMBER(1,0) NOT NULL ENABLE, 
	"IMA_TIPO_INTERRUP" NUMBER(1,0) NOT NULL ENABLE, 
	"IMA_DT_AUTORIZ_COLEGIADO" DATE, 
	"IMA_DATA_HORA" DATE);

O campo IMA_ALU_MATRICULA é a matrícula do aluno.
O campo IMA_TIPO_INTERRUP é o tipo de interrupção, que pode ser :
1 - Total
2 - Parcial

Os campos IMA_ANO e IMA_PERIODO são respectivamente o ANO e o PERÍODO em que a interrupção está sendo efetuada.
O que estou precisando é montar uma query que me retorne a matrícula do aluno, o ano e o período em que ele efetuou interrupção total e o número de interrupções efetuadas pelo aluno.
Este total de interrupções totais teria que ser agrupado POR ALUNO.

A query básica seria :

select distinct  t.ima_alu_matricula, t.ima_ano, t.ima_periodo
from interrupcoes_matricula t
where t.ima_tipo_interrup = 1
group by t.ima_alu_matricula, t.ima_ano, t.ima_periodo
order by t.ima_alu_matricula, t.ima_ano, t.ima_periodo

Tentei, na query acima, jogar um count(t.ima_matricula), logo após a coluna t.ima_periodo, mas obtive o erro "Função de grupo não permitida aqui).
Será que alguém poderia me ajudar a re-escrever esta query de modo que ela me retorne, além da matrícula, ano e período, uma outra coluna contendo o total de interrupções totais realizadas por cada aluno ?

Agradeço antecipadamente qualquer ajuda que me for enviada,

Max Carvalho

9 Respostas

pmlm
select t.ima_alu_matricula, t.ima_ano, t.ima_periodo, count(*)
from interrupcoes_matricula t
where t.ima_tipo_interrup = 1
group by t.ima_alu_matricula, t.ima_ano, t.ima_periodo
order by t.ima_alu_matricula, t.ima_ano, t.ima_periodo
ManoJava

Rodei sua query aqui e me retornou esse resultado com esses dados que inseri na tabela, será que é isso que vc estava querendo?? Apenas mudei o join pra trazer todos os alunos que tiveram interrupcoes, usando o seu count(*)

select t.ima_alu_matricula, t.ima_ano, t.ima_periodo, count(*) as num_interrupcoes_totais
from interrupcoes_matricula t
where t.ima_tipo_interrup > 0
group by t.ima_alu_matricula, t.ima_ano, t.ima_periodo
order by t.ima_alu_matricula, t.ima_ano, t.ima_periodo

IMA_ALU_M IMA_ANO IMA_PERIODO NUM_INTERRUPCOES_TOTAIS


mano 2009 2 1
pmlm 2009 1 1

Att.

M

ManoJava,

Ainda não deu certo. Em relação à sa query, a condição necessita ser t.im_tipo_interrup = 1 (e não >0) pois só quero as interrupções totais.
Tentei, então, fazer desta forma :

select t.im_matricula, t.im_ano, t.im_periodo, count(t.im_matricula) as totais 
from interrupcoes_matricula t  
where t.im_tipo_interrup = 1  
group by t.im_matricula, t.im_ano, t.im_periodo  
order by t.im_matricula, t.im_ano, t.im_periodo

Mas ainda não deu certo.
Para resumir a história toda, o que eu necessito é o seguinte :

selecione a matrícula do aluno, o ano e o período em que ele realizou trancamento total de disciplina(t.im_tipo_interrup = 1), além do total de trancamento totais agrupados por aluno.
Eu necessito do total de interrupções totais efetuadas POR ALUNO, ou seja, o cálculo do total deve ser individualizado POR ALUNO.
Agradece,

Max Carvalho

davidbuzatto

Max, fiz alguns testes aqui e a query do ManoJava está ok.

select t.ima_alu_matricula, t.ima_ano, t.ima_periodo, count(*) as num_interrupcoes_totais
from interrupcoes_matricula t
where t.ima_tipo_interrup = 1
group by t.ima_alu_matricula, t.ima_ano, t.ima_periodo
order by t.ima_alu_matricula, t.ima_ano, t.ima_periodo

A sua última query está com erro, pois t.im_matricula não existe.
É irrelevante nesse caso especificar a coluna que o count deve contar, pois o agrupamento já pega as colunas desejadas.

[]´s

francislon

Rpz…Analisando o problema e olhando a consulta, ela está aparentemente certa. Tente colocar uma condição para retornar apenas um aluno e verifique se tá retornando o valor correto.
Se não estiver então pode ser problema de consistencia no banco.

T

tenho que entregar um trabalho amanha
onde eu tenho cinco tabelas cliente, produto,pedido, itens_pedido,vendedores
e tenho que trazer como resultado
os valores totais dos pedidos
Se alguem puder me ajudar ainda hj com urgencia
eu agradeço

francislon

Estude sobre a função de agregação SUM

T

eu ja estudei mas ñ entendi
eu cheguei a usar o sum so que o resultado
dava diferente do que deveria ser
se alguem puder me da um help

francislon

A função SUM lhe retorna a soma dos valores de determinada coluna de retorno.

Por exemplo,

Você tem uma tabela Vendas, nesta você tem o valor que foi vendido e o ID do cliente que comprou:

ID Valor 1 10 2 15 3 18 3 50 1 20 5 25
Se eu fizer a seguinte consulta nesta tabela:

Esta consulta vai me retornar o seguinte valor: 138

Mas se eu fizer uma consulta com condição:

Isto vai me retornar a soma das vendas dos clientes que tenham ID maior ou igual a 3. No caso retornaria: 93

E se eu quiser que me retorne a soma das vendas de cada cliente? Eu vou fazer uma consulta a agrupar pelo ID do cliente:

Isto vai me retornar:

ID Sum(Valor) 1 30 2 15 3 68 5 25
Conseguiu entender?

Criado 30 de outubro de 2009
Ultima resposta 3 de nov. de 2009
Respostas 9
Participantes 6