Não consigo interligar 3 tabelas

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
kpetersen
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Sex, 25 Fev 2011 10:02 pm
Localização: Rio de Janeiro

Oi gente, sou programadora e estou trabalhando com base oracle a um ano, não estou conseguindo montar uma query, se alguém tiver uma luz agradeço e muito.

São 3 tabelas,

Tabela 1
(os 3 campos abaixo são varchar)

Selecionar tudo

aluno 
turma
código do curso
Tabela 2

Selecionar tudo

turma
início da turma
id do curso 
Tabela 3

Selecionar tudo

id do curso
título do curso
codigo do curso
Resultado que eu quero:
Exibir o total de alunos da tabela 1, agrupados por curso (ai aqui eu preciso do nome do curso que está na tabela 3), desde que o início da turma seja maior que 01/01/2010.

Ex:

Selecionar tudo

Código_do_curso (T1)--------C000547
Título_do_curso(T2)  --------- Seg. da Informação
Count(aluno)(T1)  ------------ 54
Eu até já consegui montar a query interligando tudo, mas ela não respeita a data de início da turma.

Ficou mais ou menos assim:

Selecionar tudo

Select count(A.alunos), C.titulo_do_curso  from Tabela1 A, Tabela3 C
where C.codigo_do_curso = A.curso and A.turma = 
(select * from Tabela1 A, Tabela2 B where A.turma = B.turma and B.inicio_do_curso > '01/01/2010')
and C.codigo_do_curso in
(select codigo_do_curso from Tabela2)
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Experimente algo assim:

Selecionar tudo

select t3.id_curso, t3.titulo_curso, t3.codigo_curso, t2.turma, t2.inicio_turma,
(select count(aluno) from tabela1 where turma = t2.turma and codigo_curso = t3.codigo_curso) cnt_alunos
from tabela2 t2, tabela3 t3
where t2.id_curso = t3.id_curso and t2.inicio_turma >= '01/01/2010'
order by 2
Se eu entendi bem o problema, isso deve solucionar.
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

ah, apenas uma observação.

O código acima vai funcionar somente se o campo inicio_turma seja do tipo date.
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP
Ricardo H. Tajiri

Não testei mas dá pra fazer algo do tipo com SQL analítico:

Selecionar tudo

SELECT count(t1.aluno) OVER (PARTITION BY t1.codigo_do_curso) total_alunos,
  t1.codigo_do_curso,
  t3.titulo_do_curso
FROM tabela1 t1
  tabela2 t2,
  tabela3 t3
WHERE t1.turma = t2.turma
  AND t1.codigo_do_curso = t3.codigo_do_curso
  AND t2.id_do_curso =  t3.id_do_curso
  ANDt2.inicio_da_turma > TO_DATE('01/01/2010','dd/mm/yyyy');
kpetersen
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Sex, 25 Fev 2011 10:02 pm
Localização: Rio de Janeiro

jsk1903
Já tinha tentado desta forma e não funcionou.

burga
Não consegui rodar, deu o erro "SQL command not properly ended".

Eu faço assim:

Selecionar tudo

select count (DISTINCT a.aluno), b.title as curso 
from 
cnt_ptb_ajusta_score a,  let_ext_offering_template b, let_ext_offering_session c
where 
      a.curso = b.offering_template_no  
      and c.class_no = a.turma 
      and c.start_date > '01/11/2010'
      and a.aluno in 
      (select distinct
       a.username 
              from 
                   tpv_pub_employees a, tpv_pub_base_registration b, let_ext_offering_session c, let_ext_offering_template d
              where
                   a.id = b.student_id and b.class_id = c.id and c.offering_temp_id = d.id 
                   and b.action_status <> '300' and c.status <> '500'
                   and 
                      d.offering_template_no in
                         (select distinct curso from cnt_ptb_ajusta_score) 
                   and c.start_date > '01/11/2010' 
      )  
group by a.curso, b.title
Aqui ele agrupa direitinho se eu retirar as referências por data, agora com a referência da data ele roda, aparece os registros mas ao conferir o resultado, ele mostra também turmas que ocorreram antes da data pesquisada.
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP
Ricardo H. Tajiri

faltou uma virgula depois de t1
kpetersen
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Sex, 25 Fev 2011 10:02 pm
Localização: Rio de Janeiro

Deu certo com o over partition!!! Muito mais simples do que eu tinha feito. Valeu mesmo!!!!
Responder
  • Informação
  • Quem está online

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