Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Gerar Tabela com médias

Fala galera beleza!

Preciso de uma ajuda relacionada a um calculo de média. resumindo tenho criada e já em funcionamento uma estrutura de classes onde eu tenho na resposta da query dentre várias informações os seguintes campos: - Pergunta - textoResposta - pesoResposta

Basicamente tenho um item onde o usuário pode dar uma nota a um departamento, porém, não existe um padrão de quantidade respostas e pesos.

Ex1: Pergunta: Nota Recepçao textoResposta = (Regular, Bom, Otimo) pesoResposta = (3, 7, 10)

Ex2: Pergunta: Nota Comercial textoResposta = (Muito Insatisfeito, Insatisfeito, Indiferente, Satisfeito, Muito Satisfeito) pesoResposta = (1, 3, 5, 7, 10)

O DB mandaria algo do tipo

(idPergunta, idResposta, textoResposta, pesoResposta)

Por fim, eu gostaria de apresentar isso em uma tabela JSF com algo do tipo:

Pergunta "X": resposta "A" (x%) | resposta "B" (y%) | resposta n (z%)

Algo assim abaixo!

<table>
    <tr>
        <td>Pergunta</td>
        <td>Resposta "A"</td>
        <td>Resposta "B"</td>
        <td>Resposta n</td>
    </tr>
    <tr>
        <td>#{Pergunta}</td>
        <td>#{qtdPct}</td>
        <td>#{qtdPct}</td>
        <td>#{qtdPct}</td>
    </tr>
</table>

Alguém pode me ajudar por favor???

Valew!

7 respostas

Fala Marco, tudo bem?

existem dois jeitos de fazer isso. No primeiro vc calcula a media no seu @ManagedBean em cima da lista de notas e ai faz o binding da media com o componente na view desse jeito que você colocou na dúvida. A outra forma é fazer a media na query que busca Resposta no banco

Oi Samir, tudo bem!!!

Então...existem alguns pontos que no meu caso não consigo fazer da forma que você orientou.

1 - As quantidades de médias podem variar de pergunta para pergunta

2- como poderia gerar as médias usando Hibernate?

3- Estava pensando em usar um HashMap assim eu colocaria algo do tipo: HashMap, onde a pergunta seria uma String com o texto da pergunta e RespostaMedia seria uma lista de objetos com os possíveis valores...

Supondo que o item 3 fosse possível, eu não sei como faria uma variavel "media" onde para um obeto ela tivesse 3 médias para outro 5 e para outro "n".

É uma pena que não posso colocar imagem creio que poderi ajudar se eu colocasse algumas imagens aqui!

Boa!

vamos resolver um problema por vez =).

1- Como esta o seu modelo de Pergunta? Uma opção é que ele tenha o texto da pergunta, e um list de respostas (que pode ser um ENUM). Para calcular a média é soma das repostas / qtd itens na lista.

2- se vc quiser fazer com hql seria algo parecido com isso:

 public static void main(String[] args) {
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.openSession();
        String sumHql = "Select sum(emp.salary) FROM Employee emp";
        String avgHql = "Select avg(emp.salary) FROM Employee emp";
        Query sumQuery = session.createQuery(sumHql);
        Query avgQuery = session.createQuery(avgHql);
        System.out.println("Sum of all salary : " + sumQuery.list().get(0));
        System.out.println("Average of salary : " + avgQuery.list().get(0));
    }

Aqui no caso é uma soma e média de salário.

Eu acho que a resposta do item 1 responde a do 3, mas confesso que não vi a necessidade de fazer um map para isso.

Show de bola...

A questão do HQL já ajuda 50% de diminuição do código...

Vou dar uma trabalhada no assunto e se tiver dúvida comento.

Vou deixar o tópico aberto ainda mas qualquer coisa depois marco como ok!

Valew Samir!

Olá Samir,

Precisei alterar algumas coisas, mas já tenho um resultado que preciso e agora precisaria de uma ajuda para gerar os devidos calculos a seguir:

Vamos supor que tenho 3 departamentos a serem avaliados. As respostas poderão ser definidas pelo departamento ex (regular, bom, otimo) (Bom, Ruim) ou seja não terá um padrão nem quantidade.

Logo o meu resultado está chegando assim:

("Qualidade da Recepção", "Bom", "3")
("Qualidade da Recepção", "Bom", "3")
("Qualidade da Recepção", "Ruim", "1")
("Qualidade da Recepção", "Ruim", "1")
("Qualidade da Recepção", "Ótimo", "5")
("Qualidade do Restaurante", "Muito Insatisfeito", "1")
("Qualidade do Restaurante", "Insatisfeito", "3")
("Qualidade do Restaurante", "Indiferente", "5")
("Qualidade do Restaurante", "Satisfeito", "8")
("Qualidade do Restaurante", "Muito Satisfeito", "10")

Obs: 1 - veja que Recepção tem (Ruim, Bom e Ótimo) 2 - já Restaurante tem (Muito Insatisfeito, Insatisfeito, Indiferente ...) 3 - O número depois é o peso da resposta

A minha query é uma TypedQuery e me retorna na verdade um Objeto da seguinte classe:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

@ManyToOne(fetch=FetchType.EAGER)
private PesquisaQualidade pesquisa;

@ManyToOne(fetch=FetchType.EAGER)
private ClienteHost cliente;

@OneToOne(fetch=FetchType.EAGER)
private Pergunta pergunta;

@OneToOne(fetch = FetchType.EAGER)
private PerguntaResposta resposta;

@Column
@Temporal(TemporalType.TIMESTAMP)
private Calendar data;

O que eu preciso gerar agora é aquela tabela que te disse

Recepção :  40% Ruim | 40% Bom | 10% Ótimo
Média Recepção: (Aqui vou fazer um cálculo com o Peso)
Restaurante: 20% M. Insat.. | 20% Insat.. | 20% Ind... | 20% Satis... | 20% M. Sati...
Média Restaurante: (Aqui vou fazer um cálculo com o Peso)

Muito obrigado pela ajuda até agora...

Marco Aurélio

Fala Marco Aurélio! desculpe a demora!

vamos lá!

Eu precisaria dar uma olhada nessas classes pra te dizer com mais precisão como fazer o calculo.

1a coisa, cuidado com esses fecth.eager, isso pode gerar muito consumo no banco a um custo de performance que as vezes não é vantajoso, prefira queries planejadas com join.

2 - vamos aos calculos(essa é uma forma, com certeza tem outras): no seu DAO, vale fazer o metodo que retorna todas as avaliações. Esse método deve retornar uma lista com as avaliações desse departamento. Vc precisa separar essa lista por departamento e depois calcular a media de cada resposta (valores) com base na qtd de itens da lista. Depois é só mostrar na tela a media de repostas daquele valor(valor/total de repostas daquele valor) e atribuir o texto referente àquele valor

solução!

Fala Samir,

eu descobri um erro na minha estrutura de classes e estou facilitando um pouco para poder continuar...

Quanto a por as classes, seria perfeito mas por aqui não consigo...

Mas enfim...vou finalizar o tópico e corrigir a estrutura....depois vejo se consigo e qq coisa crio nova pergunta....

Muito obrigado!!!!