Consulta Complexa JavaDB

Bom dia Galera,

Estou desenvolvendo um app em Java Desktop para me ajudar no trabalho. O app já está pronto e já possui inclusive alguns relatórios com gráfico já funcionando, porém preciso gerar um relatório Gráfico bem específico, com as bibliotecas do JasperReports. Meu app possui apenas uma tabela no banco de dados chamada SRDM com as seguintes colunas: id, data, enfermaria, motivo. As SRDM ou Solicitações de Reposição de Doses de Medicamentos é feita por meio de uma CI (Comunicação Interna) do Hospital, assinada pela enfermeira (só pra contextualizar!). Vamos aos detalhes. O gráfico que preciso gerar é o seguinte: no eixo X as enfermarias, no eixo Y as quantidades estratificadas por cada motivo (é como se fosse o gráfico de colunas 100% empilhadas do Excel) agrupadas por enfermaria (seria ± como a query a seguir: **SELECT ENFERMARIA, MOTIVO, COUNT(MOTIVO) FROM SRDM WHERE DATA LIKE ? GROUP BY ENFERMARIA** só que esse comando dá erro *A referência de coluna 'MOTIVO' não é válida. Em uma lista SELECT com GROUP BY, a lista pode conter apenas colunas de agrupamento e expressões de agregação válidas.*). É como se eu precisasse pegar um aprupamento por motivo e colocar dentro de um agrupamento por enfermaria. Será que isso é possível?! Esse app inclusive é baseado em uma planilha do excel que eu desenvolvi para essas coletas, porém com o app o tratamento dos dados é automatizado por uma consulta ao banco de dados, e não fico perdendo tempo compilando as informações lançadas na tabela de coleta de dados para as demais tabelas responsáveis por gerar os gráficos. Mais uma coisa, seria possível retornar os valores em % em vez de valores absolutos (por exemplo: para uma determinada enfermaria vamos supor que o total de CIs lançadas foi de 10 e dentre elas 5 foram de um determinado motivo e as outras 5 foram de outro motivo. Então, em vez do gráfico me mostrar os rótulos 5 para cada motivo, gostaria que ele mostrasse 50%.)?
Desde já agradeço aos Jedais da programação

Exporta em Excel. Fica mais prático e familiar pro usuário, e mais flexível pra programar. Além de tudo voce já tem um modelo do que fazia em Excel.

Olá javaflex,

Meu problema é criar a consulta no banco de dados que me retorne os 3 campos que preciso, ou seja, as enfermarias, (os motivos e as quantidades por motivo) por enfermaria. A partir daí dá pra gerar o relatório e exportar pra excel, pdf, etc.

Essa é a parte mais fácil. Escreve um SQL fazendo joins com tudo que necessitar e joga numa estrutura de dados. Cálculo de percentual é um conta matemática como qualquer outra, basta usar os operadores da linguagem SQL.

Se queres saber a quantidade de motivos por enfermaria, sim é o que tens de fazer

SELECT ENFERMARIA, MOTIVO, COUNT(*) 
  FROM SRDM 
 WHERE DATA LIKE ? 
 GROUP BY ENFERMARIA, MOTIVO

Para a parte de percentagem, é dividir pelo total

SELECT ENFERMARIA, MOTIVO, COUNT(*),
       COUNT(*)*100/(SELECT COUNT(*) FROM SRDM S2 WHERE S1.ENFERMARIA = S2.ENFERMARIA AND S1.DATA = S2.DATA) AS PERCENTAGEM  
  FROM SRDM S1
 WHERE DATA LIKE ? 
 GROUP BY ENFERMARIA, MOTIVO
1 curtida

Cara, eu realmente não sabia que dava pra agrupar por mais de uma categoria. Vou testar! Vlw mesmo!

Valeu pmlm.

/*FUNCIONA*/
SELECT ENFERMARIA, MOTIVO, COUNT(MOTIVO) AS QTDE FROM SRDM WHERE DATA LIKE '%21' GROUP BY ENFERMARIA, MOTIVO;
/*RETORNA AS ENFERMARIAS, OS MOTIVOS E AS QUANTIDADES POT MOTIVO*/

/*FUNCIONA*/
SELECT COUNT(*) AS TOTAL FROM SRDM;
/*RETORNA O TOTAL DE REGISTROS = 11*/

/*FUNCIONA*/
SELECT DATA, ENFERMARIA, MOTIVO, COUNT(*) AS TOTAL, COUNT(MOTIVO) AS QTDE FROM SRDM WHERE DATA LIKE '%21' GROUP BY MOTIVO, DATA, ENFERMARIA ORDER BY DATA;
/*RETORNA AS DATAS, AS ENFERMARIAS, OS MOTIVOS POR ENFERMARIA, MAS O TOTAL = QTDE POR MOTIVO*/

/*NÃO FUNCIONA*/
SELECT COUNT(MOTIVO)*100/(SELECT COUNT(*) FROM SRDM) AS PORCENTO FROM SRDM WHERE DATA LIKE '%21' GROUP BY MOTIVO;
/*A lista SELECT de uma consulta agrupada contém pelo menos uma expressão inválida. Se uma lista SELECT contém 
GROUP BY, a lista pode conter apenas colunas de agrupamento e expressões de agregação válidas.*/

/*NÃO FUNCIONA*/
SELECT MOTIVO, (COUNT(MOTIVO)*100/(SELECT COUNT(*) FROM SRDM)) AS PORCENTO FROM SRDM WHERE DATA LIKE '%21' GROUP BY MOTIVO;
/*A lista SELECT de uma consulta agrupada contém pelo menos uma expressão inválida. Se uma lista SELECT contém GROUP BY, 
a lista pode conter apenas colunas de agrupamento e expressões de agregação válidas.*/

Só não estou conseguindo retornar uma view com os motivos e os percentuais por motivo, agrupados por enfermaria para gerar um gráfico de colunas 100% empilhadas no relatório do meu programa. A solução temporária que encontrei foi montar o gráfico de coluna empilhado, com as quantidades mesmo, agrupados por enfermaria.

Qual é a base de dados? MySql? PostgreSql?

Estou usando JavaDB (Apache Derby) EmbeddedDriver (Embacado na Aplicação). Inlusive já li a documentação do Apache Derby e não encontrei nada.

Em vez do inner select, usando o select no from deverá funcionar…

SELECT ENFERMARIA, MOTIVO, COUNT(*),
       COUNT(*)*100/S2.COUNT_ENF AS PERCENTAGEM  
  FROM SRDM S1, 
      (SELECT ENFERMARIA, COUNT(*) AS COUNT_ENF FROM SRDM S GROUP BY ENFERMARIA) S2
 WHERE S1.ENFERMARIA = S2.ENFERMARIA
   AND S1.DATA = S2.DATA
   AND DATA LIKE ? 
 GROUP BY S1.ENFERMARIA, MOTIVO

Não funcionou também!

O nome de coluna 'ENFERMARIA' está presente em mais de uma tabela da lista FROM.

Não tenho como testar…

SELECT S1.ENFERMARIA, MOTIVO, COUNT(*),
       COUNT(*)*100/S2.COUNT_ENF AS PERCENTAGEM  
  FROM SRDM S1, 
      (SELECT ENFERMARIA, DATA, COUNT(*) AS COUNT_ENF FROM SRDM S GROUP BY 
ENFERMARIA, DATA) S2
 WHERE S1.ENFERMARIA = S2.ENFERMARIA
   AND S1.DATA = S2.DATA
   AND S1.DATA LIKE ? 
 GROUP BY S1.ENFERMARIA, MOTIVO