Dúvida com Group by no Oracle

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?

Saudações [b]PaulH/b],

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.

Exatamente o que o amigo falou acima, substitua pelo sql abaixo que dará certo:

Caros gfkauer e emanuelmm,

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.

Boa tarde!!

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)";

Att.

Boa tarde, ManoJava!!

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.

Você disse que precisava de todos os dados desses usuários certos?
Considerando que esses dados estejam na mesma tabela, faça o seguinte:

Primeira parte: ache os motivos que correspondem ao filtro:


  query1 =   "SELECT motivo FROM controle GROUP BY motivo HAVING COUNT(motivo) BETWEEN :minimo AND :maximo"

A query acima acha todos os motivos com essa quantidade onde :minimo e :maximo são os filtros do usuário.

A segunda parte é achar todos os dados com esses motivos:


  query2 = " SELECT * FROM controle WHERE motivo IN ( :query1 ) "

Essa segunda query trará todos os dados que precisa, sendo :query1 aquela primeira lá em cima.

Claro que você pode fazer tudo numa query só. Coloquei assim só pra ficar mais simples entender.

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.

Confesso que não entendi o que você disse.

Mas o que é exatamente esse contador?

E o que esses 26 registros tem de diferente dos outros 123?

Se possível, coloque um exemplo aqui contendo:

  • uma amostragem dos dados brutos (só as informações relevantes para a consulta)
  • um possível fator digitado pelo usuário
  • o resultado esperado
  • registros que ficariam de fora (e o motivo para ficarem)

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. :wink:

Caro,

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

wiliamps

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!