Preciso pegar TODOS os campos de uma Tabela(CONTROLE) mas que tenham a quantidade do número de campos compreendidos por valores digitados pelo usuário.Mas eu recebo o erro:[quote]java.sql.SQLSyntaxErrorException: ORA-00979: não é uma expressão GROUP BY[/quote]
Minha query é essa:
Se eu tirar o asterisco e por MOTIVO a query funciona, mas eu preciso de TODOS os campos e não apenas o MOTIVO Alguém poderia me ajudar?
O que esta acontecendo é o seguinte, sua consulta esta agrupando pela coluna motivo, mas você tras todas as colunas, isto não funciona, alem que seu count nesta situação, "select * ", sempre retornara 1, imaginando eu que vc tem uma coluna id em sua tabela.
Sinceramente, ninguem nunca “precisa de todas as colunas”, se você precisa de todas as colunas, qual a finalidade do count? Resolva esta inconsistencia e depis remonte a consulta no sqlplus ou outra ferramenta de sql para só então aplicar a sua classe.
Eu deveria ter sido mais claro.Eu preciso de todos os registros dos usuários das ocorrências que estiverem compreendidos com pelo menos um X de dados.Eu conto a coluna pois a coluna MOTIVO não é numérica.Eu preciso saber os registros dos usuários que tenham pelo menos um dado numero de ocorrências(digamos minimo 10 e máximo 100) num periodo de tempo.Digamos que o usuário digitou um mínimo de 10 e um máximo de 100.Eu quero contar o MOTIVO e pegar todos os dados daqueles que se enquadram.É uma tabela de antidoping,
digitando 10 e 100 só vem 2 colunas(testosterona e furosemida) pesquisando pelo MOTIVO.Mas eu quero os dados dos usuários dessas 2 colunas(deveriam ser 45 linhas).Espero ter sido claro.
Pq nao faz assim entao, já que vc vai ter o máximo e o minimo digitados pelo usuário:
SELECT MOTIVO, COUNT(MOTIVO) FROM CONTROLE WHERE ANO='2010' AND COUNT(MOTIVO) BETWEEN '"+minimo+"' and '"+maximo+"' GROUP BY MOTIVO HAVING COUNT(MOTIVO) ORDER BY COUNT(MOTIVO)";
O seu código não resolve o problema, pois ele só trás os dados da coluna motivo.Eu preciso de todos os dados(Select *).A coluna motivo é apenas o AGREGADOR.Eu quero TODOS os dados dos usuários cujo motivo tenham pelo menos 10 ocorrências e no máximo 100 nesse período de tempo.
AbelBueno,
tá quase!
Tô usando a sua primeira query e na segunda faço assim:
Só que eu percebi que ao invés de vir os registros do contador, vem TODOS os registros do item contado.Exemplo: se o usuário digitar entre 20 e 100 viria uma coluna com 26 registros de testosterona.Eu quero pegar os 26 registros de testosterona nesse contador.Mas estão vindo 149 registros, o que é as ocorrencias de todos os casos de doping(no sistema todo durante o ano), e não o digitado pelo controle do usuário(de 20 a 100).Se for 10 e 100 deveriam vir 45 registros(entrariam 19 de furosemida), mas vem sempre mais do que o limite compreendido no BETWEEN.
PaulH,
posso estar enganado mas o que vc quer é a SOMA dos registros do agrupamento dessas colunas(compreendidads entre o minimo e o maximo) e retornar todos os registros das mesmas.
PaulH,
posso estar enganado, mas lendo a sua query, deixe eu lhe dar uma sugestão:
ponha ANO ='"+ANO_ESCOLHIDO+"' na query interna também.Acho que o que vc está recebendo são os dados de todos os anos.
sua pergunta não ficou totalmente clara, mas consegui entender o que você pretende fazer com o SELECT.
Se não me enganei você está tentando retornar os registros que possuam vínculo com um “motivo” que tenha incidido N vezes em tal ANO.
Se for isso mesmo, segue o modelo de SELECT apropriado:
SELECT
C1.*
, C2.CONTA
FROM
CONTROLE C1
, (
SELECT
C.MOTIVO
, COUNT(1) CONTA
FROM
CONTROLE C
WHERE
C.ANO = '2010'
GROUP BY
C.MOTIVO
) C2
WHERE
C1.MOTIVO = C2.MOTIVO
AND C1.ANO = '2010'
AND C2.CONTA BETWEEN 1 AND 10
AbelBueno e wiliamps, obrigado pela ajuda!A dica do Ironlynx resolveu!Estavam vindo os resultados de vários anos e não do ano selecionado.Foi só por o ano na query interna que resolveu!Obrigado a todos!