Vou postar um dos casos,
A imagem da consulta SQL é a mesma, não será muito maior que aquilo. Aquela é um exemplo com 3 pólos. O máximo são 10, não são tantos dados para trazer do banco.
O método é este
public static ArrayList<AlternativaQuestao> getAlternativa(
Dimensao dimensao, GrupoQuestao grupoQuestao, Questao questao,
Pesquisa pesquisa) {
// Pega as descrições das alternativas das questões
String sql = "select b.nu_alternativa_tpa, a.nu_seqAlternativa_que, b.dc_alternativa_tpa "
+ "from capa..vi_alternativaQuestao_que a, "
+ "capa..vi_tipoAlternativa_tpa b where a.cd_pesquisa_pes=? "
+ "and a.cd_pesquisa_pes=b.cd_pesquisa_pes "
+ "and cd_dimensao_dim=? "
+ "and cd_grupoQuestao_grq=? "
+ "and cd_questao_qto=? "
+ "and a.nu_alternativa_tpa = b.nu_alternativa_tpa "
+ "order by a.nu_seqAlternativa_que";
Connection con = null;
ArrayList<AlternativaQuestao> lista = new ArrayList<AlternativaQuestao>();
try {
int c = 1;
con = DBUtils.getConnectionFromPool();
PreparedStatement stm = con.prepareStatement(sql);
stm.setInt(c++, pesquisa.getIdPesquisa());
stm.setInt(c++, dimensao.getCdDimensao());
stm.setInt(c++, grupoQuestao.getGrupo());
stm.setInt(c++, questao.getNumQuestao());
ResultSet rs = stm.executeQuery();
AlternativaQuestao alt;
while (rs.next()) {
alt = new AlternativaQuestao();
alt.setNumero(rs.getInt("nu_alternativa_tpa"));
alt.setDescricao(rs.getString("dc_alternativa_tpa"));
alt.setSequencia(rs.getInt("nu_seqAlternativa_que"));
}
// Consulta que retorna os respondentes por alternativa e polo (IMAGEM DO PRIMEIRO POST)
String sql2 = "select distinct cd_polo_pol, count(*) as nRespondentes, nu_alternativa_tpa "
+ "from capa..respostaQuestaoAcad_rqa "
+ "where cd_pesquisa_pes=? "
+ "and nu_sem_trm=? "
+ "and cd_dimensao_dim=? and cd_grupoQuestao_grq=? and cd_questao_qto=? "
+ "and cd_curso_rqa=? and cd_disciplina_dis=? "
+ "and nu_alternativa_tpa In(select nu_alternativa_tpa " +
"from capa..vi_alternativaQuestao_que " +
"where cd_pesquisa_pes=? and cd_dimensao_dim=? " +
"and cd_grupoQuestao_grq=? " +
"and cd_questao_qto=? ) "
+ "group by cd_polo_pol, nu_alternativa_tpa";
int c2 = 1;
PreparedStatement stm2 = con.prepareStatement(sql2);
stm2.setInt(c2++, pesquisa.getIdPesquisa());
stm2.setInt(c2++, pesquisa.getSemestre());
stm2.setInt(c2++, dimensao.getCdDimensao());
stm2.setInt(c2++, grupoQuestao.getGrupo());
stm2.setInt(c2++, questao.getNumQuestao());
stm2.setInt(c2++, DBData.cur.getCodCurso());
stm2.setString(c2++, DBData.dis.getCodigo());
stm2.setInt(c2++, pesquisa.getIdPesquisa());
stm2.setInt(c2++, dimensao.getCdDimensao());
stm2.setInt(c2++, grupoQuestao.getGrupo());
stm2.setInt(c2++, questao.getNumQuestao());
ResultSet rs2 = stm2.executeQuery();
while (rs2.next()) {...
}
// Agora preciso pegar essas linhas em rs2. Sendo que para cada Pólo + Alternativa eu tenha uma qtde de respondentes.
// Adiciona as alternativas para serem retornadas em uma lista
lista.add(alt);
return lista;
Minha idéia é montar um SQL que tenha a melhor fonte de informação(não em tamanho), mas de uma maneira fácil para ser trabalhada pela aplicação.
Segue a imagem abaixo de como são as alternativas. Um método que pega a Questão chama esse método que retorne em uma lista de Alternativas, as alternativas para cada Questão.
Um exemplo da tabela (JSF-richfaces)
[IMG]http://img140.imageshack.us/img140/8964/devmedia.th.gif[/IMG]
Eu tenho de trabalhar com esses dados na aplicação sim. Não vejo outra maneira. Ou montar um SQL onde o count() é usado para setar 0, se não encontrar uma entrada polo+alternativa(não sei como fazer isso na consulta sql).
Muito Obrigado mesmo.