2011-08-25 28 views
7

Tengo un par de registros que deben ser ordenados pero el campo es varchar. Usan el alfabeto inglés de A-Z. Después Z se pasa de AA, AB, AC, etc ... por ejemplo:¿Cómo clasifico un campo de texto alfabético?

CREATE TABLE #foo(x VARCHAR(30)); 

INSERT #foo(x) SELECT 'A' 
UNION SELECT 'AA' 
UNION SELECT 'Z' 
UNION SELECT 'B' 
UNION SELECT 'AB' 
UNION SELECT 'BB'; 

El orden que quiero en el resultado es:

A 
B 
Z 
AA 
AB 
BB 

Sé que debería utilizar un campo de número y tipo de eso, pero por el momento no tengo esa opción. Estoy usando SQL Server y la interfaz está en un informe en Access 2010.

+3

¿Tiene una pregunta? – Jacob

+2

Agregué la estructura de la tabla y los resultados deseados para @Rick. –

Respuesta

12

Esto podría funcionar. Puede ordenar por la longitud del valor que agrupará los caracteres individuales seguidos por caracteres dobles. Dentro de esos grupos, los valores se ordenarán alfabéticamente.

SELECT  Column1 
FROM  dbo.Table1 
ORDER BY LEN(Column1) 
     , Column1 
+3

+1 por la simplicidad –

+0

No sargable, sin embargo. –

2

Aquí se muestra un ejemplo para usted

Select * 
from MyTable 
Order By foo ASC, foo2 ASC, foo3 ASC 

Uso de la Orden ASC columna le permitirá ordenar que columna alfabéticamente

5
Declare @SomeStuff table (val varchar(10)); 

Insert @SomeStuff (val) Values ('a'); 
Insert @SomeStuff (val) Values ('b'); 
Insert @SomeStuff (val) Values ('c'); 
Insert @SomeStuff (val) Values ('az'); 
Insert @SomeStuff (val) Values ('ab'); 
Insert @SomeStuff (val) Values ('zz'); 
Insert @SomeStuff (val) Values ('abc1'); 


Select * From @SomeStuff order by LEN(val), val 

utiliza SQL Server, pero debería funcionar.

Resultados:

val 
--- 
a 
b 
c 
ab 
az 
zz 
abc1 
6

OK, yo un poco confundido. Parece que quieres un orden de tipo funky. Primero quiere letras sueltas y luego el orden normal. (Una especie totalmente normal tendría A, AA, AB, AC, entonces B)

En primer lugar, la clasificación simple en un campo alfabético

select SORTFIELD, OTHER, COLUMNS, IN-TABLE 
from MYTABLE 
order by SORTFIELD 

Pero eso no es lo que desea. El problema es que nunca nos dices dónde quieres AAA. ¿Va después de AA o después de ZZ?

AAA Después ZZ:

select SORTFIELD, OTHER, COLUMNS, IN-TABLE 
from MYTABLE 
order by LEN(SORTFIELD), SORTFIELD 

AAA Después AA (antes AB)

select SORTFIELD, OTHER, COLUMNS, IN-TABLE 
from MYTABLE 
order by case LEN(SORTFIELD) when 1 then 0 else 1 end , SORTFIELD 
Cuestiones relacionadas