Ver Mensaje Individual
  #6 (permalink)  
Antiguo 11/05/2011, 12:30
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: "ORDER BY" caracteres latinos

Hola clammatus:

Si decidiste migrar de BD hubieras optado por versión más actual, en lugar de SQL Server 2000, pero bueno, ese es otro rollo. Vamos a checar el problema que tienes:

Tu campo NbCompleto es un CAMPO CALCULADO y como tal no puede formar parte de la cláusula ORDER BY, es por eso que te aparece el error, aquí tienes dos opciones.

PRIMERA OPCION: calcular nuevamente el campo NbCompleto en la sección ORDER BY, quedaría más o menos así:

Código SQL:
Ver original
  1. SELECT 
  2. ...
  3. CASE
  4. WHEN charindex('Ñ',ltrim(rtrim(t102.Nb_Completo)),1) <> 0 THEN STUFF(ltrim(rtrim(t102.Nb_Completo)),charindex('Ñ' ,ltrim(rtrim(t102.Nb_Completo)),1),1,'&')
  5. ELSE ltrim(rtrim(t102.Nb_Completo))
  6. END AS NbCompleto,
  7. ...
  8. ORDER BY
  9. CASE
  10. WHEN charindex('Ñ',ltrim(rtrim(t102.Nb_Completo)),1) <> 0 THEN STUFF(ltrim(rtrim(t102.Nb_Completo)),charindex('Ñ' ,ltrim(rtrim(t102.Nb_Completo)),1),1,'&')
  11. ELSE ltrim(rtrim(t102.Nb_Completo))
  12. END, t103.Nu_ExpedienteUNAM, IsNull(De_Calificacion, '00')

Si observas se repite todo el código que tienes en tu SELECT en la parte del ORDER BY, sin poner el alias por supuesto, es lo mismo que estás haciendo para el campo IsNull(De_Calificacion, '00')

SEGUNDA OPCIÓN

Utilizar una subconsulta y ordenar en la consulta externa, es decir algo como esto:

Código SQL:
Ver original
  1. SELECT T1.* FROM
  2. (
  3. SELECT  DISTINCT t103.Nu_ExpedienteUNAM,
  4. CASE
  5. WHEN charindex('Ñ',ltrim(rtrim(t102.Nb_Completo)),1) <> 0 THEN STUFF(ltrim(rtrim(t102.Nb_Completo)),charindex('Ñ' ,ltrim(rtrim(t102.Nb_Completo)),1),1,'&')
  6. ELSE ltrim(rtrim(t102.Nb_Completo))
  7. END AS NbCompleto,
  8. IsNull(De_Calificacion, '00')
  9. FROM    t102_dAlumnoIncorporacion t102, t103_dAlumnosAsignaturas t103
  10. WHERE   t102.Pk_CveOrigen = @PkCveOrigen
  11. AND t102.Pk_CveCicEsc = @PkCveCicEsc
  12. AND t102.Pk_CveEstatus  IN  ('ALU01','ALU04')
  13. AND t102.Pk_CveOrigen   =   t103.Pk_CveOrigen
  14. AND t102.Pk_CveCicEsc   =   t103.Pk_CveCicEsc
  15. AND t102.Pk_Matricula   =   t103.Pk_Matricula
  16. AND t103.De_GrupoUNAM   NOT IN ('','9999')
  17. AND t103.De_GrupoUNAM   =   @PkCveGrupoUNAM
  18. AND t103.Pk_CveAsignatura   = @PkCveAsignatura
  19. ) T1
  20. ORDER BY NbCompleto, Nu_ExpedienteUNAM, IsNull(De_Calificacion, '00')


Si observas la consulta interna es la misma que pones, sólo quitando la parte del ORDER BY, el cual pones en el SELECT * externo. Y una recomendación final, evita listar tablas en el FROM y hacer las uniones en el WHERE. En lugar de esto utiliza JOIN's, es decir en lugar de poner

Código SQL:
Ver original
  1. FROM Tabla1, Tabla2 WHERE Tabla1.CampoID = Tabla2.CampoID

Utiliza JOIN's (INNER, LEFT O RIGTH según sea el caso)

Código SQL:
Ver original
  1. FROM Tabla1 INNER JOIN Tabla2 ON Tabla1.CampoID = Tabla2.CampoID

Aunque el resultado es el mismo, la diferencia en tiempos de respuesta puede ser enorme.

Saludos
Leo.