como criar um contador virtual numa consulta SQL

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

Respostas

29/08/2007

Emerson

qual o banco de dados?


Responder Citar

29/08/2007

Carlos_tedex

qual o banco de dados?


foi mau cara.

utilizo o SQL7 Server


Responder Citar

04/09/2007

Marconogueira

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


Responder Citar

04/09/2007

Carlos_tedex

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.


Responder Citar

05/09/2007

Romulocpd

Tente

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


Deverá funcionar conforme deseja.

Abraços


Responder Citar

06/09/2007

Carlos_tedex

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


Responder Citar

06/09/2007

Romulocpd

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.


Responder Citar

06/09/2007

Emerson

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).


Responder Citar

06/09/2007

Marcelo.bastos

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!


Responder Citar

07/09/2007

Carlos_tedex

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


Responder Citar