Ir para conteúdo

Arquivado

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

micox

[Resolvido] sql com contador

Recommended Posts

Como fazer uma SQL que contenha uma numeração para cada registro.

Por exemplo:

Tenho a Sql

Select * from users where ativo=true

Irá aparecer:

 

id Nome senha

3 Joao xxxx

4 Maria xxxx

8 Pedro xxxx

 

Voces podem verificar que o id pra mim não interessa. Eu gostaria que aparecesse também um numerador pra cada um conforme descrito abaixo:

 

num id Nome senha

1 3 Joao xxxx

2 4 Maria xxxx

3 8 Pedro xxxx

 

Onde num contem a númeração do registro. É possível fazer isso com sql???

 

Desde já valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Adicionando observações faltantes:- estou usando em VBA do Access,- Não quero fazer isto por código em VB pois estou criando uma consulta para ser usada em um List e em um relatório também, portanto fazer isto utilizando código VB fica meio difícil.- Pelo motivo informado acima, eu preciso que este 'contador' seja feito dentro da própria sql. é possível?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Micox...Pera lá ?...você está fazendo a consulta no Access ou no SQLServer ?...Eu sei que o access possui algumas funções diferentes do SQL, portanto, creio que seria mais apropriado você dar uma pesquisada no fórum de Access (Outros bancos).Entretanto, caso seja realmente SQL eu dei uma pesquisada e só encontrei forma de fazer isso com procedimentos mais longos, utilizando inserções em tabelas temporárias, utilizando a função "Identity".Verifica aí a parada do banco e posta qualquer dúvida.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pera lá ?...você está fazendo a consulta no Access ou no SQLServer ?...Eu sei que o access possui algumas funções diferentes do SQL, portanto, creio que seria mais apropriado você dar uma pesquisada no fórum de Access (Outros bancos).

Cara, eu to usando Access. Vou dar uma pesquisada lá sim, mas acho difícil encontrar, não sei nem que termo eu pesquiso.

Entretanto, caso seja realmente SQL eu dei uma pesquisada e só encontrei forma de fazer isso com procedimentos mais longos, utilizando inserções em tabelas temporárias, utilizando a função "Identity".

É... eu já havia lido um pouquinho sobre Identity e já imaginava que ia ter que fazer uma complicação dessas. Vai ser difícil... hehehe.Mais informações me ajudem aí... valeu cara. Vou continuar minha luta. heheh

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá pessoal,

 

Consegui resolver e, agora, depois de muito tempo lembrei de vir aqui postar pra caso alguém se interessar.

 

Resolvi o problema utilizando uma tabela temporária (chamada TEMP) e com algumas procedures (sub, função, como quiserem chamar).

 

A tabela TEMP:

campo1: nome (texto 20 caracteres)

campo2: valor (texto 50 caracteres)

 

A função (foi feita em VB pois estou utilizando o access):

Public Sub Altera_Temp(Campo As String, Valor As String)	DBEngine(0)(0).Execute ("UPDATE Temp SET Valor='" & Valor & "' WHERE Nome='" & Campo & "'")End SubPublic Function Reseta_Contador(lixo As String)	Altera_Temp "contador", "0"End FunctionPublic Function Numera(Categoria As Integer, Algum_campo As Integer) As Integer'é usado pra criar um campo de autonumeração em algum select.'Antes de ser executado, o campo Contador deve ser resetado na tabela Temp usando a função Altera_Temp'obs. O campo 'algum_campo' deve ser preenchido com algum campo agrupador para o contador funcionar	Dim atual, cat_anterior	atual = DLookup("Valor", "Temp", "Nome='Contador'")	cat_anterior = DLookup("Valor", "Temp", "Nome='Categoria'")	If IsNull(atual) Or IsNull(cat_anterior) Then 'se ainda não há o campo contador		DBEngine(0)(0).Execute ("INSERT INTO Temp(Nome,Valor) VALUES('Contador','0')")		DBEngine(0)(0).Execute ("INSERT INTO Temp(Nome,Valor) VALUES('Categoria','0')")		atual = 0: cat_anterior = 0	End If	If Categoria <> Val(cat_anterior) Then		DBEngine(0)(0).Execute ("UPDATE Temp SET Valor='" & Categoria & "' WHERE Nome='Categoria'") 'atualizando		atual = 0	End If	atual = Val(atual) + 1 'incrementando	DBEngine(0)(0).Execute ("UPDATE Temp SET Valor='" & atual & "' WHERE Nome='Contador'") 'atualizando	Numera = atual 'retornandoEnd Function

A SQL resultante para numerar os registros ficou:

SELECT Numera([cr],[emp_id]) AS Posição, View_Ranking_CR_mini.*FROM View_Ranking_CR_mini;

Quando você executa ela retorna:

Posição CR emp_id Empreiteira

1 505 31 Empresa A

2 505 19 Empresa B

3 505 53 Empresa C

4 505 60 Empresa D

5 505 26 Empresa E

6 505 12 Empresa F

7 505 32 Empresa G

8 505 18 Empresa H

1 606 35 Empresa B

2 606 29 Empresa A

1 607 35 Empresa A

 

 

Desta forma eu consigo fazer um ranking e exibir a posição de determinada empresa neste ranking, e ainda consigo separar por categorias (no caso acima, a categoria e o campo CR).

 

Qualquer dúvida futura é so me mandar uma mensagem.

Valeu a todos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Public Sub Altera_Temp(Campo As String, Valor As String)
DBEngine(0)(0).Execute ("UPDATE Temp SET Valor='" & Valor & "' WHERE Nome='" & Campo & "'")
End Sub


Public Function Reseta_Contador(lixo As String)
Altera_Temp "contador", "0"
End Function

Public Function Numera(Categoria As Integer, Algum_campo As Integer) As Integer
'é usado pra criar um campo de autonumeração em algum select.
'Antes de ser executado, o campo Contador deve ser resetado na tabela Temp usando a função Altera_Temp
'obs. O campo 'algum_campo' deve ser preenchido com algum campo agrupador para o contador funcionar
Dim atual, cat_anterior
atual = DLookup("Valor", "Temp", "Nome='Contador'")
cat_anterior = DLookup("Valor", "Temp", "Nome='Categoria'")
If IsNull(atual) Or IsNull(cat_anterior) Then 'se ainda não há o campo contador
	DBEngine(0)(0).Execute ("INSERT INTO Temp(Nome,Valor) VALUES('Contador','0')")
	DBEngine(0)(0).Execute ("INSERT INTO Temp(Nome,Valor) VALUES('Categoria','0')")
	atual = 0: cat_anterior = 0
End If
If Categoria <> Val(cat_anterior) Then
	DBEngine(0)(0).Execute ("UPDATE Temp SET Valor='" & Categoria & "' WHERE Nome='Categoria'") 'atualizando
	atual = 0
End If
atual = Val(atual) + 1 'incrementando
DBEngine(0)(0).Execute ("UPDATE Temp SET Valor='" & atual & "' WHERE Nome='Contador'") 'atualizando
Numera = atual 'retornando
End Function

 

Como fazer esse tipo de consulta via SQL Server?

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

Seria um contador para cada registro igual.

1 | 16IDEA727712820110111
2 | 16IDEA727712820110111
3 | 16IDEA727712820110111

1 | 27UNO787486120110111

1 | 32207787480620100910
2 | 32207787480620100910
3 | 32207787480620100910

1 | 38IDEA745340420110111
2 | 38IDEA745340420110111
3 | 38IDEA745340420110111

 

 

 

Seria um contador para cada registro igual.

1 | 16IDEA727712820110111
2 | 16IDEA727712820110111
3 | 16IDEA727712820110111

1 | 27UNO787486120110111

1 | 32207787480620100910
2 | 32207787480620100910
3 | 32207787480620100910

1 | 38IDEA745340420110111
2 | 38IDEA745340420110111
3 | 38IDEA745340420110111

 

RESOLVIDO

SELECT 
ROW_NUMBER() OVER (PARTITION BY id_modelo ORDER BY id_modelo) AS num,
id_modelo
FROM 
TABELA

Compartilhar este post


Link para o post
Compartilhar em outros sites

boa noite

to levando porrada ak para usar um contador em uma consulta sql.

a situação é a seguinte:

tenho a tabela TESTE

com os campos ano_pago,nro_boleto,cod_boleto,id

executo o seguinte select

select ano_pago, nro_boleto,cod_boleto

from teste

group by id

order by nro_boleto,cod_boleto

o resultado é o seguinte:

ano_pago nro_boleto cod_boleto

2009 1 201

2008 1 202

2007 1 202

2006 1 202

2009 1 203

2009 1 204

2009 2 201

2008 2 202

2007 2 202

 

 

gostaria que o resultado fosse assim:

ano_pago nro_boleto cod_boleto num_item

2009 1 201 1

2008 1 202 2

2007 1 202 3

2006 1 202 4

2009 1 203 5

2009 1 204 6

2009 2 201 1

2008 2 202 2

2007 2 202 3

 

Alguem poderia me ajudar

Compartilhar este post


Link para o post
Compartilhar em outros sites

dalveson,

Bem vindo ao fórum.

 

No post #9 tem uma solução com a função ROW_NUMBER().

 

Sugiro, antes de postar, dar uma pesquisada dentro do fórum. Recentemente um usario teve a mesma dúvida:

http://forum.imasters.com.br/topic/440692-exibir-o-id-da-linha/

 

Abçs e boa sorte

Compartilhar este post


Link para o post
Compartilhar em outros sites

dalveson,

Bem vindo ao fórum.

 

No post #9 tem uma solução com a função ROW_NUMBER().

 

Sugiro, antes de postar, dar uma pesquisada dentro do fórum. Recentemente um usario teve a mesma dúvida:

http://forum.imasters.com.br/topic/440692-exibir-o-id-da-linha/

 

Abçs e boa sorte

 

boa noite

segui o topico orientado porem nao obtive sucesso.

pesquisando um pouco mais encontrei o seguinte:

 

SELECT @rownum:=@rownum+1 contador ,t. *FROM (SELECT @rownum:=0) r, teste t

order by nro_boleto,cod_boleto;

 

funcionou de boa so nao to conseguindo fazer ele contar separado para cada boleto, esta saindo assim:

ano_pago nro_boleto cod_boleto contador

2009 1 201 1

2008 1 202 2

2007 1 202 3

2006 1 202 4

2009 1 203 5

2009 1 204 6

2009 2 201 7

2008 2 202 8

2007 2 202 9

 

gostaria que saise separado o contador para cada boleto, no caso assim:

ano_pago nro_boleto cod_boleto contador

2009 1 201 1

2008 1 202 2

2007 1 202 3

2006 1 202 4

2009 1 203 5

2009 1 204 6

2009 2 201 1

2008 2 202 2

2007 2 202 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

dalveson

 

Qual a sua versão de SQL?Siga os exemplos do post #11 e tera exemplo que tera o row_number() com o agregador group by....

Abçs

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.