Ir para conteúdo

POWERED BY:

Arquivado

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

vecp

Sortear 3 resultados no SQL

Recommended Posts

ola, estou passando meus bancos e queria saber se é possivel no SQL selecionar aleatoriamente apenas 3 resultados de uma tabela em ordem decrescenteResultados disponiveis no campo qt0,12 0,19 0,29 0,89 0,35 Exs de resultados obtidos que eu queria que fosse mostrado de forma aleatoria:-----Resultado 10,290,190,12-----Resultado 20,350,290,19-----Resultado 30,890,350,29e assim por dianteTentei varias formas entre elas:SQL="SELECT Top 3 FROM tabela order by qt desc , rand()"mas o rand nao funciona e ele pega sempre os top 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu ja tinha tentado o NewID()

 

Ele até funciona mas quando ele só randomiza a ordem entre resultados iguais, ou seja

ids com resultados inferiores a esses nao aparecem por causa do top acho

 

"SELECT top 7 qt,ID FROM tabela order by qt desc , newID()"

 

Ex:

0,32 ---- (ID 343)

0,31 ---- (ID 1)

0,31 ---- (ID 63)

0,22 ---- (ID 506)

0,21 ---- (ID 507)

0,20 ---- (ID 174)

0,20 ---- (ID 851)

 

0,32 ---- (ID 343)

0,31 ---- (ID 1)

0,31 ---- (ID 63)

0,22 ---- (ID 506)

0,21 ---- (ID 507)

0,20 ---- (ID 851)

0,20 ---- (ID 174)

Compartilhar este post


Link para o post
Compartilhar em outros sites

troca issoorder by qt desc , newID()" pororder by newID()" porque senão vai ordenar primeiro por qt

Compartilhar este post


Link para o post
Compartilhar em outros sites

tambei ja tentei, mas eu preciso dos resultados com o qt decrescentee dessa forma nao fica"SELECT top 7 qt,ID FROM tabela order by newID()" -----Resultados 10,31 ---- (ID 1) 0,22 ---- (ID 506) 0,31 ---- (ID 63) 0,32 ---- (ID 343) 0,24 ---- (ID 851) 0,27 ---- (ID 174) 0,21 ---- (ID 507) -----Resultados 20,32 ---- (ID 343) 0,27 ---- (ID 174) 0,31 ---- (ID 63) 0,24 ---- (ID 851) 0,21 ---- (ID 507) 0,31 ---- (ID 1) 0,22 ---- (ID 506) No total eu tenho uns 20 resultados no qual preciso sortear aleatoriamente3 resultados e mostra-los em ordem decrescente

Compartilhar este post


Link para o post
Compartilhar em outros sites

entao você tera que fazer dois select o primeiro ira trazer todos os id aleatoriamente

 

e o segundo select ira pegar os 3 dados e deixar por ordem descrescente

 

assim

 

sql = SELECT * qt,ID FROM tabela order by newID()" set rs = conn.execute(sql)"dim idDim zid = array()z=1'faco o loop para pegar os 3 dados			while not rs.EOF	ReDim preserve id(UBound(id)+1) 	id(Ubound(id))= rs("qt") 'aqui você joga o campo do seu banco	z=z+1	rs.MoveNextwendrs.Closeif z>3 then	response.write id(0)&"<br>"	response.write id(1)&"<br>"	response.write id(2)&"<br>"end ifsql2 = "SELECT * FROM tabela where in ('" & id(0) & "', '" & id(1) & "', '" & id(2) & "') order by qt desc" set rs2 = conn.execute

bom axu q é isto testa ae qq coisa fala ae

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao sei se fiz algo errado mas nao deu nao

-----------------------------

sql = "SELECT qt,ID FROM tabela order by newID()"

set rs = conn.execute(sql)

 

dim id

Dim z

id = array()

z=1

 

'faco o loop para pegar os 3 dados

while not rs.EOF

ReDim preserve id(UBound(id)+1)

id(Ubound(id))= rs("qt") 'aqui você joga o campo do seu banco

z=z+1

rs.MoveNext

wend

rs.Close

 

if z > 3 then

response.write id(0)&"<br>"

response.write id(1)&"<br>"

response.write id(2)&"<br>"

end if

 

sql2 = "SELECT * FROM tabela where in ('" & id(0) & "', '" & id(1) & "', '" & id(2) & "') order by qt desc"

set rs2 = conn.execute

 

deu erro na linha acima:

Erro de tempo de execução do Microsoft VBScript (0x800A01C2)

Número de argumentos incorreto ou atribuição de propriedade inválida: 'execute'

/includes/001.asp, line 32

-------------------------------

 

e eu coloquei set rs2 = conn.execute(sql2) e deu:

Microsoft OLE DB Provider for SQL Server (0x80040E14)

Incorrect syntax near the keyword 'in'.

/includes/001.asp, line 32

Compartilhar este post


Link para o post
Compartilhar em outros sites

desculpas foi erro meu:

no sql 2 você vai deixar assim:

 

sql2 = "SELECT * FROM tabela where qt in ('" & id(0) & "', '" & id(1) & "', '" & id(2) & "') order by qt desc"

beleza

Compartilhar este post


Link para o post
Compartilhar em outros sites

deu o erroDisallowed implicit conversion from data type varchar to data type smallmoney, table 'database.dbo.tabela', column 'qt'. Use the CONVERT function to run this query.Com certeza é porque o campo qt é no formato smallmoneyComo seria esse CONVERT?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso pode ser resolvido na SQL, é só alterar a prioridade da ordem:"SELECT top 7 qt,ID FROM tabela order by newID(), qt DESC"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso pode ser resolvido na SQL, é só alterar a prioridade da ordem:"SELECT top 7 qt,ID FROM tabela order by newID(), qt DESC"

era justo o que ia falar agorateste assim http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

ola , na realidade o erro era no sql2 mas nao por causa do order mas sim por causa do formato do envio

Ai tirei as aspas e acessou o banco. Acho q é por causa do formato da moeda no banco SQL

 

sql2 = "SELECT * FROM tabela where qt in (" & id(0) & ", " & id(1) & ", " & id(2) & ") order by qt desc"

Mas mesmo assim não deu certo ainda, tem algo errado

 

Vou refazer tudo aqui e ja posto

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que esta contecendo é o seguinte, eu nao entendi a logica ai

 

Quem ta imprimindo os resultados é o comando:

 

if z > 3 then

response.write id(0)&"<br>"

response.write id(1)&"<br>"

response.write id(2)&"<br>"

end if

 

mas ele ainda nao passou pelo sql2 entao finalizei e tentei finalizar para ver se dava, mas nao deu nao

 

<% Set Conn = Server.CreateObject("ADODB.Connection") Conn.open DSNtempSet RS = Server.CreateObject("ADODB.Recordset") sql = "SELECT qt,ID FROM tabela order by newID()" set rs = conn.execute(sql)dim idDim zid = array()z=1while not rs.EOFReDim preserve id(UBound(id)+1) 	id(Ubound(id))= rs("qt") 'aqui você joga o campo do seu banco	z=z+1RS.MoveNextwendif z > 3 then	response.write id(0)&"<br>"	response.write id(1)&"<br>"	response.write id(2)&"<br>"end ifSet RS2 = Server.CreateObject("ADODB.Recordset") sql2 = "SELECT * FROM tabela where qt in (" & id(0) & ", " & id(1) & ", " & id(2) & ") order by qt desc"Set RS2=Conn.Execute(sql2)while not rs2.EOF%><%= rs2("qt") %><% RS2.MoveNextwend %>

Nao entendi ainda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos

 

primeiro você fez um select aleatorio que ira gerar 3 resultados eu recupero este 3 resultados pelo Array

 

'faco o loop para pegar os 3 dados			while not rs.EOF	ReDim preserve id(UBound(id)+1) 	id(Ubound(id))= rs("qt") 'aqui você joga o campo do seu banco	z=z+1	rs.MoveNextwend

ai eu so fiz um teste e imprimi estes 3 resultados do sql 1 (você pode tirar esta parte do codigo)

if z>3 then	response.write id(0)&"<br>"	response.write id(1)&"<br>"	response.write id(2)&"<br>"end if

--------

 

Ae eu vou para o meu segundo sql aonde eu ordeno ele por qtd e coloco uma clausula In para pegar os 3 resultados do Sql1

 

sql2 = "SELECT * FROM tabela where qtd in ('" & id(0) & "', '" & id(1) & "', '" & id(2) & "') order by qt desc" set rs2 = conn.execute

e para você imprimir estes 3 resultado finais é simples

 

do while not rs2.eofresponsse.write(qtd & "<br>")rs2.movenextLoop

depois fala o resultado ae ok

Compartilhar este post


Link para o post
Compartilhar em outros sites

tamo chegando la, tinha uma pegada por causa do campo smallmoney no sql

 

Vamos la:

 

para conseguir pegar os dados no campo smallmoney converti a virgula para ponto

 

valor = rs("qt")	valor = Replace(valor,".","")	qtok = Replace(valor,",",".")	id(Ubound(id))= qtok 'aqui você joga o campo do seu banco	z=z+1RS.MoveNextwend

Ai tirei o teste e mandei imprimir os resultados

 

Set RS2 = Server.CreateObject("ADODB.Recordset") sql2 = "SELECT * FROM tabela where qt in (" & id(0) & ", " & id(1) & ", " & id(2) & ") order by qt desc"Set RS2=Conn.Execute(sql2)while not rs2.EOF%>qt <%= rs2("qt") %> - ID: <%= rs2("id") %><br><% RS2.MoveNextwend %>

Até imprimiu mas ainda tem uma pegadiha pois quando

 

so existe um valor unico de qt imprime beleza 3 resultados:

 

qt 0,45 - ID: 5

qt 0,29 - ID: 2

qt 0,27 - ID: 3

 

mas quando tem valores iguais ele repete :

 

qt 0,47 - ID: 4

qt 0,45 - ID: 5

qt 0,31 - ID: 6

qt 0,31 - ID: 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bingo!

 

para não repetir guardamos no Array o ID que deve ser eutonumeração e assim nao repetira

 

Deu perfeito , mas so deu um probleminha:

 

Se encontrar no minimo 3 resultados entao da erro:

 

Subscrito fora do intervalo: '[number: 0]'

 

Vou pensar numa saida para isso, tem alguma ideia de cabeça?

 

Set RS = Server.CreateObject("ADODB.Recordset") sql = "SELECT qt,ID FROM tabela order by newID()" set rs = conn.execute(sql)dim idDim zid = array()z=1while not rs.EOFReDim preserve id(UBound(id)+1) 	id(Ubound(id))= rs("id") ' auto numeraçao ara nao repetir	z=z+1RS.MoveNextwendSet RS2 = Server.CreateObject("ADODB.Recordset") sql2 = "SELECT * FROM tabela where id in (" & id(0) & ", " & id(1) & ", " & id(2) & ") order by qt desc"Set RS2=Conn.Execute(sql2)while not rs2.EOF%>qt <%= rs2("qt") %> - ID: <%= rs2("id") %><br><% RS2.MoveNextwend %><%RS.closeset RS = nothingRS2.closeset RS2 = nothingconn.closeset conn = nothing%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que se considerarmos chamar 6 resultados por vez isso poderia funcionar:

 

 

Considerando count = rs.recordcount entao

 

SELECT * FROM tabela where id incase when count = '1' then '(" & id(0) & ") order by qt desc'	 when count = '2' then '(" & id(0) & ", " & id(1) & ") order by qt desc'	 when count = '3' then '(" & id(0) & ", " & id(1) & ", " & id(2) & ") order by qt desc'	 when count = '4' then 'in (" & id(0) & ", " & id(1) & ", " & id(2) & ", " & id(3) & ") order by qt desc'	 when count = '5' then '(" & id(0) & ", " & id(1) & ", " & id(2) & ", " & id(3) & "," & id(4) & "," & id(5) & ")' else '(" & id(0) & ", " & id(1) & ", " & id(2) & ", " & id(3) & "," & id(4) & "," & id(5) & ")'end

mas nao conseguir aplicar isso no codigo para funcionar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ai que ta, to migrando e conhecendo agora o SQL e sei pouco

 

Como crio o view e aplico ele dentro do codigo?

 

Eu acho que tenho que substituir

 

sql2 = "SELECT * FROM tabela where qt in (" & id(0) & ", " & id(1) & ", " & id(2) & ") order by qt desc"

por isso

 

SELECT * FROM tabela where id incase when count = '1' then '(" & id(0) & ") order by qt desc'	 when count = '2' then '(" & id(0) & ", " & id(1) & ") order by qt desc'	 when count = '3' then '(" & id(0) & ", " & id(1) & ", " & id(2) & ") order by qt desc'	 when count = '4' then 'in (" & id(0) & ", " & id(1) & ", " & id(2) & ", " & id(3) & ") order by qt desc'	 when count = '5' then '(" & id(0) & ", " & id(1) & ", " & id(2) & ", " & id(3) & "," & id(4) & "," & id(5) & ")' else '(" & id(0) & ", " & id(1) & ", " & id(2) & ", " & id(3) & "," & id(4) & "," & id(5) & ")'end

mas nao sei como colocar dentro do codigo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora deu, ta feito, aqui aparentemente funcionou

 

Sorteio em banco SQL de 6 resultados aleatorios em ordem decrescente de valores

 

<% DSNtemp="Provider=SQLOLEDB;Persist Security Info=False;Data Source=sqlserver01.dominio;Initial Catalog=database;User Id=user;Password=senha"Set Conn = Server.CreateObject("ADODB.Connection") Conn.open DSNtempSet RS = Server.CreateObject("ADODB.Recordset") sql = "SELECT qt,ID FROM tabela where qt > 0.10 order by newID()" RS.Open sql, Conn,3 count = rs.recordcountif count <> 0 thendim idDim zid = array()z=1while not rs.EOFReDim preserve id(UBound(id)+1) 	id(Ubound(id))= rs("id") ' auto numeraçao ara nao repetir	z=z+1RS.MoveNextwendSet RS2 = Server.CreateObject("ADODB.Recordset") Select Case count	Case 1  sql2 = "SELECT * FROM tabela where id in (" & id(0) & ") order by qt desc"	Case 2sql2 = "SELECT * FROM tabela where id in (" & id(0) & ", " & id(1) & ") order by qt desc"	Case 3sql2 = "SELECT * FROM tabela where id in (" & id(0) & ", " & id(1) & ", " & id(2) & ") order by qt desc"	Case 4sql2 = "SELECT * FROM tabela where id in (" & id(0) & ", " & id(1) & ", " & id(2) & " , " & id(3) & ") order by qt desc"	Case 5sql2 = "SELECT * FROM tabela where id in (" & id(0) & ", " & id(1) & ", " & id(2) & " , " & id(3) & ", " & id(4) & ") order by qt desc"	Case Else sql2 = "SELECT * FROM tabela where id in (" & id(0) & ", " & id(1) & ", " & id(2) & " , " & id(3) & ", " & id(4) & ", " & id(5) & ") order by qt desc"End SelectSet RS2=Conn.Execute(sql2)while not rs2.EOF%>qt <%= rs2("qt") %> - ID: <%= rs2("id") %><br><% RS2.MoveNextwend RS2.closeset RS2 = nothingEnd ifRS.closeset RS = nothingconn.closeset conn = nothing%>

valeu a todos que colaboraram

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza cara que bom q você entendeu a logica do esquema trabalhar com array é mto bomflwabraços

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.