Ordenar registros

25/07/2006 - 16:42 por frank | Informe spam
Hola,

Necesito ordenar por un campo definido como nvarchar(400) pero sin tener en
cuenta los posibles caracteres "raros" del principio.
O sea,
¿B?
A
se debe ordenar como A, ¿B? (en una ordenación normal, el caracter '¿' vá
antes de la 'A')

Lo puedo hacer añadiendo una clausula
Order By replace(memArticle, '¿','')
Y me lo ordena bien.

el problema, es que tengo un select de esta forma:

select
identity(int) as Codi,
memArticle
INTO tblArticlesindexats
FROM tblArticles
ORDER BY Replace(memArticle, '¿', '') //Así falla. Pero solo en un select
con un INTO

Y necesito que el identity sea creado de acuerdo al order by.

Adjunto el script con la creacion de las tablas y los select de lo que estoy
haciendo.

SET NOCOUNT ON

iF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'tblAOrdenar')
DROP TABLE tblAOrdenar

CREATE TABLE tblAOrdenar
(
lngID int,
memArticle nvarchar(400)
)

GO

INSERT INTO tblAOrdenar VALUES (1, '¿B')
INSERT INTO tblAOrdenar VALUES (2, 'A')
INSERT INTO tblAOrdenar VALUES (4, '¿C')
INSERT INTO tblAOrdenar VALUES (3, 'AB')


GO
SET NOCOUNT OFF

PRINT 'ORDEN NATURAL'
select * from tblAOrdenar order by memArticle
GO
PRINT 'ORDEN SIN INTERROGANTES' --ESTE ES EL ORDEN QUE QUIERO CONSEGUIR
select * from tblAOrdenar order by replace(memArticle,'¿','')
GO

iF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'tblOrdenats')
DROP TABLE tblOrdenats

go
select
identity(int) as codi,
memArticle
into tblOrdenats

from tblAOrdenar
order by
replace(memArticle,'¿','')


GO
PRINT 'ORDEN EN LA NUEVA TABLA'
SELECT * from tblOrdenats ORDER BY codi

Grácias

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
25/07/2006 - 17:27 | Informe spam
Frank,

Yo no puedo reproducir el error en mi maquina (no da error). Que version de
sql server estas usando, incluyendo service pack?


AMB

"frank" wrote:

Hola,

Necesito ordenar por un campo definido como nvarchar(400) pero sin tener en
cuenta los posibles caracteres "raros" del principio.
O sea,
¿B?
A
se debe ordenar como A, ¿B? (en una ordenación normal, el caracter '¿' vá
antes de la 'A')

Lo puedo hacer añadiendo una clausula
Order By replace(memArticle, '¿','')
Y me lo ordena bien.

el problema, es que tengo un select de esta forma:

select
identity(int) as Codi,
memArticle
INTO tblArticlesindexats
FROM tblArticles
ORDER BY Replace(memArticle, '¿', '') //Así falla. Pero solo en un select
con un INTO

Y necesito que el identity sea creado de acuerdo al order by.

Adjunto el script con la creacion de las tablas y los select de lo que estoy
haciendo.

SET NOCOUNT ON

iF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'tblAOrdenar')
DROP TABLE tblAOrdenar

CREATE TABLE tblAOrdenar
(
lngID int,
memArticle nvarchar(400)
)

GO

INSERT INTO tblAOrdenar VALUES (1, '¿B')
INSERT INTO tblAOrdenar VALUES (2, 'A')
INSERT INTO tblAOrdenar VALUES (4, '¿C')
INSERT INTO tblAOrdenar VALUES (3, 'AB')


GO
SET NOCOUNT OFF

PRINT 'ORDEN NATURAL'
select * from tblAOrdenar order by memArticle
GO
PRINT 'ORDEN SIN INTERROGANTES' --ESTE ES EL ORDEN QUE QUIERO CONSEGUIR
select * from tblAOrdenar order by replace(memArticle,'¿','')
GO

iF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'tblOrdenats')
DROP TABLE tblOrdenats

go
select
identity(int) as codi,
memArticle
into tblOrdenats

from tblAOrdenar
order by
replace(memArticle,'¿','')


GO
PRINT 'ORDEN EN LA NUEVA TABLA'
SELECT * from tblOrdenats ORDER BY codi

Grácias









Respuesta Responder a este mensaje
#2 frank
25/07/2006 - 17:42 | Informe spam
Hola Alejandro,

No. No me dá error. El problema, es el orden en el que se insertan los
registros en la tabla "tblOrdenats"
A mi, el último select me sale en este orden:
1 ¿B
2 A
3 ¿C
4 AB

cuando el orden correcto (segun el order by replace(memArticle, '¿', '')
deberia ser:
1 A
2 AB
3 ¿B
4 ¿C

Estoy utilizando SQL2000 con SP3
Gracias.


"Alejandro Mesa" escribió en el
mensaje news:
Frank,

Yo no puedo reproducir el error en mi maquina (no da error). Que version


de
sql server estas usando, incluyendo service pack?


AMB

"frank" wrote:

> Hola,
>
> Necesito ordenar por un campo definido como nvarchar(400) pero sin tener


en
> cuenta los posibles caracteres "raros" del principio.
> O sea,
> ¿B?
> A
> se debe ordenar como A, ¿B? (en una ordenación normal, el caracter '¿'



> antes de la 'A')
>
> Lo puedo hacer añadiendo una clausula
> Order By replace(memArticle, '¿','')
> Y me lo ordena bien.
>
> el problema, es que tengo un select de esta forma:
>
> select
> identity(int) as Codi,
> memArticle
> INTO tblArticlesindexats
> FROM tblArticles
> ORDER BY Replace(memArticle, '¿', '') //Así falla. Pero solo en un


select
> con un INTO
>
> Y necesito que el identity sea creado de acuerdo al order by.
>
> Adjunto el script con la creacion de las tablas y los select de lo que


estoy
> haciendo.
>
> SET NOCOUNT ON
>
> iF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
> WHERE TABLE_NAME = 'tblAOrdenar')
> DROP TABLE tblAOrdenar
>
> CREATE TABLE tblAOrdenar
> (
> lngID int,
> memArticle nvarchar(400)
> )
>
> GO
>
> INSERT INTO tblAOrdenar VALUES (1, '¿B')
> INSERT INTO tblAOrdenar VALUES (2, 'A')
> INSERT INTO tblAOrdenar VALUES (4, '¿C')
> INSERT INTO tblAOrdenar VALUES (3, 'AB')
>
>
> GO
> SET NOCOUNT OFF
>
> PRINT 'ORDEN NATURAL'
> select * from tblAOrdenar order by memArticle
> GO
> PRINT 'ORDEN SIN INTERROGANTES' --ESTE ES EL ORDEN QUE QUIERO CONSEGUIR
> select * from tblAOrdenar order by replace(memArticle,'¿','')
> GO
>
> iF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
> WHERE TABLE_NAME = 'tblOrdenats')
> DROP TABLE tblOrdenats
>
> go
> select
> identity(int) as codi,
> memArticle
> into tblOrdenats
>
> from tblAOrdenar
> order by
> replace(memArticle,'¿','')
>
>
> GO
> PRINT 'ORDEN EN LA NUEVA TABLA'
> SELECT * from tblOrdenats ORDER BY codi
>
> Grácias
>
>
>
>
>
>
>
>
>
Respuesta Responder a este mensaje
#3 Miguel Egea
25/07/2006 - 18:40 | Informe spam
En SQLServer 2005 que es el único que tengo instalado, funciona exactamente
como esperas, pero no está garanizado en absoluto a través del identity así
que tendrás que recurrir a trucos que te lo garantizen como por ejemplo

select
(select count(*)
from tblAOrdenar t
where replace(t.memArticle,'¿','')
<=replace(tblAordenar.memArticle,'¿',''))
as codi,
memArticle
into tblOrdenats
from tblAOrdenar

La putada es que esto irá más lento que tu insert, por cierto en sqlserver
2005 tampoco utilizarías identity(int) para insertar un autonumérico sino
que usarías
select
row_number() over (order by replace(memArticle,'¿','')) as codi,
memArticle
from tblAOrdenar


Saludos cordiales
Miguel Egea

Saludos
Miguel Egea
"frank" wrote in message
news:
Hola Alejandro,

No. No me dá error. El problema, es el orden en el que se insertan los
registros en la tabla "tblOrdenats"
A mi, el último select me sale en este orden:
1 ¿B
2 A
3 ¿C
4 AB

cuando el orden correcto (segun el order by replace(memArticle, '¿', '')
deberia ser:
1 A
2 AB
3 ¿B
4 ¿C

Estoy utilizando SQL2000 con SP3
Gracias.


"Alejandro Mesa" escribió en el
mensaje news:
Frank,

Yo no puedo reproducir el error en mi maquina (no da error). Que version


de
sql server estas usando, incluyendo service pack?


AMB

"frank" wrote:

> Hola,
>
> Necesito ordenar por un campo definido como nvarchar(400) pero sin
> tener


en
> cuenta los posibles caracteres "raros" del principio.
> O sea,
> ¿B?
> A
> se debe ordenar como A, ¿B? (en una ordenación normal, el caracter '¿'



> antes de la 'A')
>
> Lo puedo hacer añadiendo una clausula
> Order By replace(memArticle, '¿','')
> Y me lo ordena bien.
>
> el problema, es que tengo un select de esta forma:
>
> select
> identity(int) as Codi,
> memArticle
> INTO tblArticlesindexats
> FROM tblArticles
> ORDER BY Replace(memArticle, '¿', '') //Así falla. Pero solo en un


select
> con un INTO
>
> Y necesito que el identity sea creado de acuerdo al order by.
>
> Adjunto el script con la creacion de las tablas y los select de lo que


estoy
> haciendo.
>
> SET NOCOUNT ON
>
> iF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
> WHERE TABLE_NAME = 'tblAOrdenar')
> DROP TABLE tblAOrdenar
>
> CREATE TABLE tblAOrdenar
> (
> lngID int,
> memArticle nvarchar(400)
> )
>
> GO
>
> INSERT INTO tblAOrdenar VALUES (1, '¿B')
> INSERT INTO tblAOrdenar VALUES (2, 'A')
> INSERT INTO tblAOrdenar VALUES (4, '¿C')
> INSERT INTO tblAOrdenar VALUES (3, 'AB')
>
>
> GO
> SET NOCOUNT OFF
>
> PRINT 'ORDEN NATURAL'
> select * from tblAOrdenar order by memArticle
> GO
> PRINT 'ORDEN SIN INTERROGANTES' --ESTE ES EL ORDEN QUE QUIERO CONSEGUIR
> select * from tblAOrdenar order by replace(memArticle,'¿','')
> GO
>
> iF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
> WHERE TABLE_NAME = 'tblOrdenats')
> DROP TABLE tblOrdenats
>
> go
> select
> identity(int) as codi,
> memArticle
> into tblOrdenats
>
> from tblAOrdenar
> order by
> replace(memArticle,'¿','')
>
>
> GO
> PRINT 'ORDEN EN LA NUEVA TABLA'
> SELECT * from tblOrdenats ORDER BY codi
>
> Grácias
>
>
>
>
>
>
>
>
>




Respuesta Responder a este mensaje
#4 Alejandro Mesa
25/07/2006 - 19:11 | Informe spam
Frank,

Tratemos alterando la tabla [tblAOrdenar], adicionando una columna calculada
referenciando la formula y creando un indice nonclustered usando esa columna.
Luego ordenamos por esta columna durante el insert.

alter table tblAOrdenar
add c1 as replace(memArticle,'¿','')
go

create nonclustered index tblAOrdenar_c1_nu_nc_ix
on dbo.tblAOrdenar(c1 asc)
go

select identity(int) as codi, memArticle
into dbo.t1
from tblAOrdenar
order by c1
go

PRINT 'ORDEN EN LA NUEVA TABLA - t1'
SELECT * from dbo.t1 ORDER BY codi
go

Resultado:

ORDEN EN LA NUEVA TABLA - t1

codi memArticle
1 A
2 AB
3 ¿B
4 ¿C

(4 row(s) affected)


AMB

"frank" wrote:

Hola Alejandro,

No. No me dá error. El problema, es el orden en el que se insertan los
registros en la tabla "tblOrdenats"
A mi, el último select me sale en este orden:
1 ¿B
2 A
3 ¿C
4 AB

cuando el orden correcto (segun el order by replace(memArticle, '¿', '')
deberia ser:
1 A
2 AB
3 ¿B
4 ¿C

Estoy utilizando SQL2000 con SP3
Gracias.


"Alejandro Mesa" escribió en el
mensaje news:
> Frank,
>
> Yo no puedo reproducir el error en mi maquina (no da error). Que version
de
> sql server estas usando, incluyendo service pack?
>
>
> AMB
>
> "frank" wrote:
>
> > Hola,
> >
> > Necesito ordenar por un campo definido como nvarchar(400) pero sin tener
en
> > cuenta los posibles caracteres "raros" del principio.
> > O sea,
> > ¿B?
> > A
> > se debe ordenar como A, ¿B? (en una ordenación normal, el caracter '¿'

> > antes de la 'A')
> >
> > Lo puedo hacer añadiendo una clausula
> > Order By replace(memArticle, '¿','')
> > Y me lo ordena bien.
> >
> > el problema, es que tengo un select de esta forma:
> >
> > select
> > identity(int) as Codi,
> > memArticle
> > INTO tblArticlesindexats
> > FROM tblArticles
> > ORDER BY Replace(memArticle, '¿', '') //Así falla. Pero solo en un
select
> > con un INTO
> >
> > Y necesito que el identity sea creado de acuerdo al order by.
> >
> > Adjunto el script con la creacion de las tablas y los select de lo que
estoy
> > haciendo.
> >
> > SET NOCOUNT ON
> >
> > iF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
> > WHERE TABLE_NAME = 'tblAOrdenar')
> > DROP TABLE tblAOrdenar
> >
> > CREATE TABLE tblAOrdenar
> > (
> > lngID int,
> > memArticle nvarchar(400)
> > )
> >
> > GO
> >
> > INSERT INTO tblAOrdenar VALUES (1, '¿B')
> > INSERT INTO tblAOrdenar VALUES (2, 'A')
> > INSERT INTO tblAOrdenar VALUES (4, '¿C')
> > INSERT INTO tblAOrdenar VALUES (3, 'AB')
> >
> >
> > GO
> > SET NOCOUNT OFF
> >
> > PRINT 'ORDEN NATURAL'
> > select * from tblAOrdenar order by memArticle
> > GO
> > PRINT 'ORDEN SIN INTERROGANTES' --ESTE ES EL ORDEN QUE QUIERO CONSEGUIR
> > select * from tblAOrdenar order by replace(memArticle,'¿','')
> > GO
> >
> > iF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
> > WHERE TABLE_NAME = 'tblOrdenats')
> > DROP TABLE tblOrdenats
> >
> > go
> > select
> > identity(int) as codi,
> > memArticle
> > into tblOrdenats
> >
> > from tblAOrdenar
> > order by
> > replace(memArticle,'¿','')
> >
> >
> > GO
> > PRINT 'ORDEN EN LA NUEVA TABLA'
> > SELECT * from tblOrdenats ORDER BY codi
> >
> > Grácias
> >
> >
> >
> >
> >
> >
> >
> >
> >



Respuesta Responder a este mensaje
#5 Miguel Egea
25/07/2006 - 20:41 | Informe spam
Alejandro, revisa esta publicación (te habría escrito en privado pero no se
como), si hay algo que no esté bien, dimelo y lo quito :) (o entra en msn y
charlamos.)

http://www.configuracionesintegrale...articulo22

Saludos


"Alejandro Mesa" wrote in message
news:
Frank,

Tratemos alterando la tabla [tblAOrdenar], adicionando una columna
calculada
referenciando la formula y creando un indice nonclustered usando esa
columna.
Luego ordenamos por esta columna durante el insert.

alter table tblAOrdenar
add c1 as replace(memArticle,'¿','')
go

create nonclustered index tblAOrdenar_c1_nu_nc_ix
on dbo.tblAOrdenar(c1 asc)
go

select identity(int) as codi, memArticle
into dbo.t1
from tblAOrdenar
order by c1
go

PRINT 'ORDEN EN LA NUEVA TABLA - t1'
SELECT * from dbo.t1 ORDER BY codi
go

Resultado:

ORDEN EN LA NUEVA TABLA - t1

codi memArticle
1 A
2 AB
3 ¿B
4 ¿C

(4 row(s) affected)


AMB

"frank" wrote:

Hola Alejandro,

No. No me dá error. El problema, es el orden en el que se insertan los
registros en la tabla "tblOrdenats"
A mi, el último select me sale en este orden:
1 ¿B
2 A
3 ¿C
4 AB

cuando el orden correcto (segun el order by replace(memArticle, '¿', '')
deberia ser:
1 A
2 AB
3 ¿B
4 ¿C

Estoy utilizando SQL2000 con SP3
Gracias.


"Alejandro Mesa" escribió en el
mensaje news:
> Frank,
>
> Yo no puedo reproducir el error en mi maquina (no da error). Que
> version
de
> sql server estas usando, incluyendo service pack?
>
>
> AMB
>
> "frank" wrote:
>
> > Hola,
> >
> > Necesito ordenar por un campo definido como nvarchar(400) pero sin
> > tener
en
> > cuenta los posibles caracteres "raros" del principio.
> > O sea,
> > ¿B?
> > A
> > se debe ordenar como A, ¿B? (en una ordenación normal, el caracter
> > '¿'

> > antes de la 'A')
> >
> > Lo puedo hacer añadiendo una clausula
> > Order By replace(memArticle, '¿','')
> > Y me lo ordena bien.
> >
> > el problema, es que tengo un select de esta forma:
> >
> > select
> > identity(int) as Codi,
> > memArticle
> > INTO tblArticlesindexats
> > FROM tblArticles
> > ORDER BY Replace(memArticle, '¿', '') //Así falla. Pero solo en un
select
> > con un INTO
> >
> > Y necesito que el identity sea creado de acuerdo al order by.
> >
> > Adjunto el script con la creacion de las tablas y los select de lo
> > que
estoy
> > haciendo.
> >
> > SET NOCOUNT ON
> >
> > iF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
> > WHERE TABLE_NAME = 'tblAOrdenar')
> > DROP TABLE tblAOrdenar
> >
> > CREATE TABLE tblAOrdenar
> > (
> > lngID int,
> > memArticle nvarchar(400)
> > )
> >
> > GO
> >
> > INSERT INTO tblAOrdenar VALUES (1, '¿B')
> > INSERT INTO tblAOrdenar VALUES (2, 'A')
> > INSERT INTO tblAOrdenar VALUES (4, '¿C')
> > INSERT INTO tblAOrdenar VALUES (3, 'AB')
> >
> >
> > GO
> > SET NOCOUNT OFF
> >
> > PRINT 'ORDEN NATURAL'
> > select * from tblAOrdenar order by memArticle
> > GO
> > PRINT 'ORDEN SIN INTERROGANTES' --ESTE ES EL ORDEN QUE QUIERO
> > CONSEGUIR
> > select * from tblAOrdenar order by replace(memArticle,'¿','')
> > GO
> >
> > iF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
> > WHERE TABLE_NAME = 'tblOrdenats')
> > DROP TABLE tblOrdenats
> >
> > go
> > select
> > identity(int) as codi,
> > memArticle
> > into tblOrdenats
> >
> > from tblAOrdenar
> > order by
> > replace(memArticle,'¿','')
> >
> >
> > GO
> > PRINT 'ORDEN EN LA NUEVA TABLA'
> > SELECT * from tblOrdenats ORDER BY codi
> >
> > Grácias
> >
> >
> >
> >
> >
> >
> >
> >
> >



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida