Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

[SOLUCIONADO] Ordenamiento Ascendente de codigo

Estas en el tema de Ordenamiento Ascendente de codigo en el foro de SQL Server en Foros del Web. Buen día, mi consulta es respecto a como podría hacer para ordenar según código (que esta establecido como campo varchar debido a las estandarizaciones que ...
  #1 (permalink)  
Antiguo 13/03/2014, 15:09
 
Fecha de Ingreso: septiembre-2010
Mensajes: 91
Antigüedad: 14 años, 2 meses
Puntos: 9
Ordenamiento Ascendente de codigo

Buen día, mi consulta es respecto a como podría hacer para ordenar según código (que esta establecido como campo varchar debido a las estandarizaciones que manejan acá), pero de momento solo escriben números, y en algún momento podrían llegar a escribir números y letras.

Antes de confundirlos la cosa esta asi:
Tengo una tabla con algunos campos, el campo que corresponde al código es tipo varchar(10)

Los usuarios de momento solo escriben números (1,2,3,4,5,6,7,8,9,10,11,12,13,14...etc) lo cual lo hacen manualmente ya que asi lo querían (solo le he puesto primary para evitar que se de repetición)

Ahora el problema, en la pantalla yo le he puesto Order By Codigo, pero muestra algo como lo siguiente:
1
10
11
2
20
21
22
.
.
.

Y asi sucesivamente, cuando deberias de verse:
1
2
3
4
5
6
7
8
9
10
.
.
.

El problema es que no puedo pasarlo a int porque según parece en algún momento introducirán códigos como A1, B1, etc. entonces viene la pregunta:

Cómo puedo hacer para que aparezcan los códigos debidamente ordenados sin problemas de excepciones por intentar una conversión si en algún momento hay letras en el código???

De antemano muchas gracias por su ayuda.
  #2 (permalink)  
Antiguo 13/03/2014, 16:00
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Ordenamiento Ascendente de codigo

quizas esto te sirva:

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. valor VARCHAR(20)
  4. )
  5.  
  6.  
  7. INSERT INTO #temp VALUES ('4')
  8. INSERT INTO #temp VALUES ('2')
  9. INSERT INTO #temp VALUES ('3')
  10. INSERT INTO #temp VALUES ('1')
  11. INSERT INTO #temp VALUES ('A1')
  12. INSERT INTO #temp VALUES ('A2')
  13. INSERT INTO #temp VALUES ('5')
  14. INSERT INTO #temp VALUES ('6')
  15. INSERT INTO #temp VALUES ('A3')
  16. INSERT INTO #temp VALUES ('B1')
  17. INSERT INTO #temp VALUES ('7')
  18.  
  19. SELECT CONVERT(VARCHAR(20),campo) FROM(
  20. SELECT CASE WHEN isnumeric(valor)=1 THEN CONVERT(INT,valor) END campo FROM #temp
  21. ) AS t1 WHERE campo IS NOT NULL
  22. UNION
  23. SELECT * FROM(
  24. SELECT CASE WHEN isnumeric(valor)=0 THEN valor END campo FROM #temp
  25. ) AS t1 WHERE campo IS NOT NULL

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 13/03/2014, 16:26
 
Fecha de Ingreso: septiembre-2010
Mensajes: 91
Antigüedad: 14 años, 2 meses
Puntos: 9
Respuesta: Ordenamiento Ascendente de codigo

Hola libras, antes que nada gracias por tu tiempo y tu ayuda, fijate que intente hacer eso que me pusiste, pero al final da el mismo resultado, en tu ejemplo se veia todo bien pero el problema es cuando ya hay numeros arriba de 10, se comienzan a mezclar

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. valor VARCHAR(20)
  4. )
  5.  
  6.  
  7. INSERT INTO #temp VALUES ('4')
  8. INSERT INTO #temp VALUES ('2')
  9. INSERT INTO #temp VALUES ('3')
  10. INSERT INTO #temp VALUES ('1')
  11. INSERT INTO #temp VALUES ('10')
  12. INSERT INTO #temp VALUES ('11')
  13. INSERT INTO #temp VALUES ('A1')
  14. INSERT INTO #temp VALUES ('A2')
  15. INSERT INTO #temp VALUES ('5')
  16. INSERT INTO #temp VALUES ('6')
  17. INSERT INTO #temp VALUES ('A3')
  18. INSERT INTO #temp VALUES ('B1')
  19. INSERT INTO #temp VALUES ('7')
  20.  
  21. SELECT CONVERT(VARCHAR(20),campo) FROM(
  22. SELECT CASE WHEN isnumeric(valor)=1 THEN CONVERT(INT,valor) END campo FROM #temp
  23. ) AS t1 WHERE campo IS NOT NULL
  24. UNION
  25. SELECT * FROM(
  26. SELECT CASE WHEN isnumeric(valor)=0 THEN valor END campo FROM #temp
  27. ) AS t1 WHERE campo IS NOT NULL

Lanza este resultado:

Código XML:
Ver original
  1. 1
  2. 10
  3. 11
  4. 2
  5. 3
  6. 4
  7. 5
  8. 6
  9. 7
  10. A1
  11. A2
  12. A3
  13. B1

Conoces alguna otra forma de hacerlo? yo ya estuve probando hasta con el case when else:

Código SQL:
Ver original
  1. SELECT CASE WHEN isnumeric(CODIGO)=1 THEN CONVERT(INT,CODIGO) ELSE CODIGO END  AS campo FROM dbo.PAQUETE

Pero aunque le ponga el else siempre trata de hacer la conversión cuando hay letras y me tira error.

De antemano muchas gracias por la ayuda
  #4 (permalink)  
Antiguo 13/03/2014, 16:43
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Ordenamiento Ascendente de codigo

Código SQL:
Ver original
  1. IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp
  2. IF OBJECT_ID('tempdb..#ordenada') IS NOT NULL DROP TABLE #ordenada
  3.  
  4. CREATE TABLE #temp
  5. (
  6. valor VARCHAR(20)
  7. )
  8.  
  9.  
  10. INSERT INTO #temp VALUES ('4')
  11. INSERT INTO #temp VALUES ('2')
  12. INSERT INTO #temp VALUES ('3')
  13. INSERT INTO #temp VALUES ('1')
  14. INSERT INTO #temp VALUES ('A1')
  15. INSERT INTO #temp VALUES ('A2')
  16. INSERT INTO #temp VALUES ('5')
  17. INSERT INTO #temp VALUES ('6')
  18. INSERT INTO #temp VALUES ('A3')
  19. INSERT INTO #temp VALUES ('B1')
  20. INSERT INTO #temp VALUES ('7')
  21. INSERT INTO #temp VALUES ('10')
  22. INSERT INTO #temp VALUES ('100')
  23. INSERT INTO #temp VALUES ('20')
  24. INSERT INTO #temp VALUES ('ABC10')
  25. INSERT INTO #temp VALUES ('ABC01')
  26.  
  27. DROP TABLE #ordenada
  28.  
  29. CREATE TABLE #ordenada
  30. (
  31. orden INT IDENTITY(1,1),
  32. campo VARCHAR(20)
  33. )
  34.  
  35.  
  36.  
  37. INSERT INTO #ordenada
  38. SELECT * FROM(
  39. SELECT CASE WHEN isnumeric(valor)=1 THEN CONVERT(INT,valor) END campo FROM #temp
  40. ) AS t1 WHERE campo IS NOT NULL
  41. ORDER BY campo ASC
  42.  
  43.  
  44. INSERT INTO #ordenada
  45. SELECT * FROM(
  46. SELECT CASE WHEN isnumeric(valor)=0 THEN valor END campo FROM #temp
  47. ) AS t1 WHERE campo IS NOT NULL
  48.  
  49. SELECT campo FROM #ordenada

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 14/03/2014, 08:21
 
Fecha de Ingreso: septiembre-2010
Mensajes: 91
Antigüedad: 14 años, 2 meses
Puntos: 9
Respuesta: Ordenamiento Ascendente de codigo

Muchas gracias Libras, funcionó perfecto :D

Etiquetas: campo, ordenamiento, siguiente, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:15.