Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Daniel Paes

[Resolvido] Cláusula ORDER BY (*) em conflito com DISTINCT

Recommended Posts

Olá!

 

Estou tentando pegar dados de 2 tabelas e ordernar com a soma de uma coluna da tabela, mas já tentei de tudo e não consegui ainda. Segue o codigo:

 

("SELECT distinct iduser.*, (SELECT sum(goljogo) FROM idjogo WHERE idjogo.iduser = iduser.iduser) as gols, (SELECT count(presencajogo) FROM idjogo WHERE idjogo.iduser = iduser.iduser and idjogo.presencajogo = 1) as partida FROM iduser inner join idjogo on iduser.iduser = idjogo.iduser order by gols desc")

 

Sem o codigo destacado, o codigo funciona normal (segue exemplo):

 

Jogador: » Player1- Jogos: 3 - Gols: 9

Jogador: » Player2- Jogos: 3 - Gols: 3

Jogador: » Player3- Jogos: 3 - Gols: 8

Jogador: » Player4- Jogos: 3 - Gols: 3

 

Mas quando tento ordenar ele da esse erro:

 

Microsoft OLE DB Provider for ODBC Drivers erro '80040e07'

 

[Microsoft][Driver ODBC para Microsoft Access] Cláusula ORDER BY (gols) em conflito com DISTINCT.

 

Gostaria de saber se alguem tem alguma ideia de como eu posso ordenar a coluna gols??

 

desde já agradeço a ajuda :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

olha este exemplo:

 

SELECT DISTINCT x FROM test_table

ORDER BY y

 

 

esta SQL são não-determinística. O mecanismo faz uma classificação implícita para o SELECT DISTINCT. Se ele tiver os pares (x0,y1),(x0,y2), um deles tem que ir devido a x DISTINCT. Mas qual delas deve ir?

 

A decisão de que o mecanismo faz afetará onde na classificação ordem (x 0) aparece, porque a classificação para a cláusula ORDER BY é feita sempre última. Devido a-determinismo in a semântica de uma instrução SELECT, não quando você tenta executá-lo, você irá gerar o erro:

[Microsoft][ODBC Microsoft Access 2.0 driver] Cláusula ORDER BY (y) está em conflito com DISTINCT

SQLSTATE = "22005", NativeError =-3015

Observe que o que você deseja pode ser obtido pela seguinte consulta:

 

SELECT DISTINCT x,y FROM test_table

ORDER BY y

 

 

isso fará com que valores duplicados de x que você não caso contrário veria tinha você não incluídos y na Selecione lista. No entanto, na maioria dos casos, isso é uma solução muito aceitável.

Compartilhar este post


Link para o post
Compartilhar em outros sites

coloque a posição da coluna. Para isto você terá que saber quantoas colunas vem da tabela iduser já que usa o *(indicado nunca fazer isso e sim colocar cada coluna que realmente vai precisar). faz tempo que não mexo com acceses e não lembro se tem suporte a ordenação por posição, mas tente(troque numerodacolunadesejada por um numero inteiro correspondente a pseudo coluna 'gols')

 

("SELECT distinct iduser.*, (SELECT sum(goljogo) FROM idjogo WHERE idjogo.iduser = iduser.iduser) as gols, (SELECT count(presencajogo) FROM idjogo WHERE idjogo.iduser = iduser.iduser and idjogo.presencajogo = 1) as partida
FROM iduser inner join idjogo on iduser.iduser = idjogo.iduser 
order by numerodacolunadesejada desc")

 

caso não funcione faça uma pseudo tabela para ordenar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

dá um response.write na sua string SQL para ver o que esta sendo passado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentar explicar mais um pouco.

 

São duas Tabelas: Iduser e idjogo

 

Na tabela iduser tem todos os dados do usuário, mas eu so vou precisar dos campo (iduser e nomeuser / (ex. 1 / Player1)) para mostrar o que eu quero.

 

Na segunda tabela Idjogo eu vou precisar de todos os dados (presenca, gols, data, iduser) que serão atualizado toda semana puxando dados da tabela.campo iduser.iduser que esta relacionada com a tabela.campo idjojo.iduser da tabela idjogo.. Os dados na coluna IDJOGO ficariam assim:

 

idjogo: 1 iduser: 1 presenca: 1 gols: 5 data: 11/11/2011

idjogo: 2 iduser: 1 presenca: 1 gols: 3 data: 15/11/2011

idjogo: 3 iduser: 1 presenca: 0 gols: 0 data: 19/11/2011 <---- aqui seria uma falta do integrante.

idjogo: 4 iduser: 1 presenca: 1 gols: 5 data: 11/11/2011

 

 

Como podem ver, cada dado enviado a tabela idjogo esta relacionada a um dado do iduser (no caso aqui ao id numero 1), eu tive que colocar DISTINCT para que os dados não fossem duplicados, triplicados ou mais, pois toda semana serão enviados dados para a tabela relacionado a um usuário do iduser.

 

O meu problema no caso é fazer a soma deses GOLS (no caso o total do exemplo é 13) e ordenar do maior para o menor.

 

Ordenando sem o DISTINCT da esse erro:

Microsoft OLE DB Provider for ODBC Drivers erro '80040e10'

 

[Microsoft][Driver ODBC para Microsoft Access] Parâmetros insuficientes. Eram esperados 1.

 

Sem ordenar e sem o distinct ficaria assim:

 

Player 1 - 3 jogos - 13 gols

Player 1 - 3 jogos - 13 gols

Player 1 - 3 jogos - 13 gols

Player 1 - 3 jogos - 13 gols

 

Como ve, ele soma os dados e mostra ele repetidas vezes (tantas quantas tiver relacionadas ao iduser)

 

e com o distinct sem o Order by, funciona redondinho....

 

Já tentei de tudo (ou quase, mas busquei q nem um doido solução mas não achei, tinha até visto uma resposta parecida com a do xanburzum, mas como meu conhecimento é limitado, fiquei sem entender o que realmente era para ser feito para resolver o problema)

 

Será q a estrutura que eu montei esta errada???

 

Espero ter conseguido passar o que to querendo :P

 

Desde já agradeço a ajuda de todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

porque precisa fazer distinct? Se a tabela é de usuarios, julgo que deva ter um iduser para cada usuario e nunca repetir

 

as duas alternativas que passei seria assim:

SELECT distinct iduser.iduser, iduser.nomeuser, (SELECT sum(goljogo) FROM idjogo WHERE idjogo.iduser = iduser.iduser) as gols, (SELECT count(presencajogo) FROM idjogo WHERE idjogo.iduser = iduser.iduser and idjogo.presencajogo = 1) as partida FROM iduser inner join idjogo on iduser.iduser = idjogo.iduser order by 3 desc

ou

 

select t.* from
(SELECT distinct iduser.iduser, iduser.nomeuser, (SELECT sum(goljogo) FROM idjogo WHERE idjogo.iduser = iduser.iduser) as gols, (SELECT count(presencajogo) FROM idjogo WHERE idjogo.iduser = iduser.iduser and idjogo.presencajogo = 1) as partida FROM iduser inner join idjogo on iduser.iduser = idjogo.iduser
) t
order by t.gols desc

 

ou ainda

SELECT iduser.iduser, iduser.nomeuser, sum(idjogo.goljogo) as gols, (SELECT count(presencajogo) FROM idjogo WHERE idjogo.iduser = iduser.iduser and idjogo.presencajogo = 1) as partida FROM iduser inner join idjogo on iduser.iduser = idjogo.iduser group by iduser.iduser, iduser.nomeuser

 

e outra

 

SELECT distinct iduser.iduser, iduser.nomeuser, (SELECT sum(goljogo) FROM idjogo WHERE idjogo.iduser = iduser.iduser) as gols, (SELECT count(presencajogo) FROM idjogo WHERE idjogo.iduser = iduser.iduser and idjogo.presencajogo = 1) as partida FROM iduser order by 3 desc

 

caso tenha montado a estrutura, ecomendo pesquisar sobre nomenclaturas, está um pouco confuso o nome das tabelas com as colunas.

 

tem outras formas de montar esse sql.

 

Pelo que itnerpretei você quer somar os gols da tabela idjogoe contar quantas presenças da tabela idjogo para cada usuario que teve algum registro em idjogo, isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

você tem um relacionamento entre as tabelas

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeeeeeeeeeeeeeeeeeeuuuuuu jonathandj!!!!!! essa opção aqui resolveu meu problema:

 

select t.* from

(SELECT distinct iduser.iduser, iduser.nomeuser, (SELECT sum(goljogo) FROM idjogo WHERE idjogo.iduser = iduser.iduser) as gols, (SELECT count(presencajogo) FROM idjogo WHERE idjogo.iduser = iduser.iduser and idjogo.presencajogo = 1) as partida FROM iduser inner join idjogo on iduser.iduser = idjogo.iduser

) t

order by t.gols desc

 

Eu uso o distinct para não repetir os dados da tabela idjogo que tem relacionamento com a tabela iduser..

A tabela iduser tem usuários os ids fixo de cada jogador, mas na idjogo vai registrando a presença e os gols de cada um semanalmente, fazendo assim ter vários dados relacionado a esse id. Mas era isso mesmo que eu queria, pegar as presenças q cada um tem, somar os gols e ordenar pela soma total de gols.

 

Vou dar uma pesquisada sobre nomenclatura, pois faz bastante tempo q não mexo com ASP e já não era grande coisa naquela epoca, agora depois de mais de anos sem mexer só me fez piorar kkkkkkk

 

Cara agradeço mesmo a força de todos... Forum imaster, ajudando nas minhas tentativas de brincar com ASP desde 2003 :P

 

Obrigado a todos :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.