como criar um contador virtual numa consulta SQL

SQL Server

29/08/2007

Ex.:

select CODIGO, NOME from CLIENTES

RESULTADO:
1 JOSE
2 MARIA
4 JOAO
5 CARLOS
11 JOAQUIM

gostaria que ficasse assim:

1 JOSE 1
2 MARIA 2
4 JOAO 3
5 CARLOS 4
11 JOAQUIM 5


Carlos_tedex

Carlos_tedex

Curtidas 0

Melhor post

Romulocpd

Romulocpd

05/09/2007

Tente

SELECT CODIGO, NOME, (row_number() over (order by CODIGO))
FROM CLIENTES


Deverá funcionar conforme deseja.

Abraços


GOSTEI 1

Mais Respostas

Emerson Nascimento

Emerson Nascimento

29/08/2007

qual o banco de dados?


GOSTEI 0
Carlos_tedex

Carlos_tedex

29/08/2007

qual o banco de dados?


foi mau cara.

utilizo o SQL7 Server


GOSTEI 0
Marconogueira

Marconogueira

29/08/2007

Parece que o FireBird tem uma função chamada GEN_ID para fazer isso. No SQL SERVER eu não conheço nenhuma, mas dá pra fazer assim:
Criar uma tabela temporária com um campo IDENTITY para guardar o número da linha.
Ex:
CREATE TABLE #tmpTeste (codigo INTEGER, nome VARCHAR(40), linha INTEGER IDENTITY)
INSERT INTO tmpTeste SELECT Codigo, Nome FROM Clientes

SELECT * FROM tmpTeste
DROP TABLE tmpTeste


GOSTEI 0
Carlos_tedex

Carlos_tedex

29/08/2007

Parece que o FireBird tem uma função chamada GEN_ID para fazer isso. No SQL SERVER eu não conheço nenhuma, mas dá pra fazer assim: Criar uma tabela temporária com um campo IDENTITY para guardar o número da linha.


Caro marconogueira,

sua dica deve dar certo sim... mas é justamente isso que eu não queria... ter que criar uma tabela temporaria, na verdade eu queria criar esse campo na propria consulta SQL sem intermedio do Delphi... mas agradeço sua atenção.


GOSTEI 0
Carlos_tedex

Carlos_tedex

29/08/2007

Tente
SELECT CODIGO, NOME, (row_number() over (order by CODIGO))
FROM CLIENTES


Amigo, tentei esse comando no SQL7 e 8 e nos dois deram o mesmo erro, dizendo que essa função não é reconhecida. veja:

Server: Msg 195, Level 15, State 10, Line 1
´row_number´ is not a recognized function name.


QQ novidade posta ai pra nois... valew


GOSTEI 0
Romulocpd

Romulocpd

29/08/2007

Não me lembrei deste detalhe. Utilizo o SQL 2005 Enterprise, talvez o comando pertença somente a ele.

Daí não sei não.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

29/08/2007

tente assim:
select
  rank=count(*), a1.CODIGO, a1.NOME
from
  CLIENTES a1, CLIENTES a2
where
  a1.codigo + a1.nome >= a2.codigo + a2.nome
group by
  a1.codigo, a1.nome
order by
  rank


note que eu assumi que CODIGO é um campo string. se for numérico, utilize CAST para converter em string (char/varchar).


GOSTEI 0
Marcelo.bastos

Marcelo.bastos

29/08/2007

Carlos,

esse é um forma que eu gosto de utilizar para gerar um código virtual. Além de ser bem simples e funcionará em qualquer banco de dados.

SELECT A.NOME,
(SELECT (COUNT(*) + 1)
FROM CLIENTES B
WHERE B.NOME < A.NOME) AS COD_VIRTUAL
FROM CLIENTES A
ORDER BY A.NOME

No caso de você tentar utilizar ROW_NUMBER() é um função nova adicionada a versão do SQL Server 2005.

Valeu!


GOSTEI 0
Carlos_tedex

Carlos_tedex

29/08/2007

Finalmente... rsrsrs

- Pessoal, gostaria de agradecer a atenção de todos os que me ajudaram nessa consulta SQL. mas as dicas dos seguintes usuários resolveram o problema:
[b:af4631265d]
- emerson.en
- marcelo.bastos[/b:af4631265d]

valew msm... pois essa consulta será de grande utilidade num relatório que estou desenvolvendo...

Abraços...


GOSTEI 0
POSTAR