Array
(
)

como criar um contador virtual numa consulta SQL

Carlos_tedex
   - 29 ago 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

Emerson
   - 29 ago 2007

qual o banco de dados?

Carlos_tedex
   - 29 ago 2007


Citação:
qual o banco de dados?


foi mau cara.

utilizo o SQL7 Server

Marconogueira
   - 04 set 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

Carlos_tedex
   - 04 set 2007


Citação:
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.

Romulocpd
   - 05 set 2007

Tente

#Código

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


Deverá funcionar conforme deseja.

Abraços

Carlos_tedex
   - 06 set 2007


Citação:
Tente

#Código

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:

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


QQ novidade posta ai pra nois... valew

Romulocpd
   - 06 set 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.

Emerson
   - 06 set 2007

tente assim:
#Código

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

Marcelo.bastos
   - 06 set 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!

Carlos_tedex
   - 07 set 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:

- emerson.en
- marcelo.bastos

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

Abraços...