Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-11-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
¿Y por qué no funciona el ORDER BY?

Me vais a mandar a la porra, como poco, por pesado. El query que había planteado en los anteriores hilos ha quedado así al final:
Código SQL [-]
SELECT DISTINCT A.Codigo, A.Nombre, COALESCE(RDB$GET_CONTEXT('USER_TRANSACTION', 'MUNICIPIO'), 1) Municipio, C.Nombre NomMunicipio,
       (SELECT SUM(Votos) FROM Resultados WHERE CodPrv = A.CodPrv AND Partido = A.Codigo AND Proceso = B.Proceso 
           AND Mesa IN (SELECT Codigo FROM Mesas WHERE CodPrv = A.CodPrv AND Municipio = COALESCE(RDB$GET_CONTEXT('USER_TRANSACTION', 'MUNICIPIO'), 1))) VotPar,
       RDB$SET_CONTEXT('USER_TRANSACTION', 'MUNICIPIO', (SELECT FIRST 1 Municipio FROM Mesas WHERE CodPrv = B.CodPrv AND Codigo = B.Mesa ORDER BY Municipio))
FROM Partidos A
LEFT JOIN Resultados B ON A.CodPrv = B.CodPrv AND A.Codigo = B.Partido AND B.Proceso = :Proceso
LEFT JOIN Poblacion C ON A.CodPrv = C.CodPrv AND COALESCE(RDB$GET_CONTEXT('USER_TRANSACTION', 'MUNICIPIO'), 1) = C.Codigo
WHERE A.CodPrv = :PrvIns AND A.Codigo > 0 
  AND EXISTS (SELECT Municipio FROM Mesas WHERE CodPrv = B.CodPrv AND Codigo = B.Mesa)
ORDER BY 4, 5 DESC, 2
Dado que con ese query tengo que alimentar un TreeView me interesa añadir ese campo con los votos obtenidos. Funciona como un tiro gracias a la sugerencia de duilioisola pero me ocurre un cosa muy curiosa: no ordena bien todo. Fijaros en las filas destacadas:

A pesar de haber puesto como segundo campo de ordenación la suma de votos en orden descendente, hace lo que le da la gana
Responder Con Cita
  #2  
Antiguo 06-11-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Será porque es alfanumérico?
Responder Con Cita
  #3  
Antiguo 06-11-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿Será porque es alfanumérico?
Los campos 4 y 2 (Nombre del municipio y nombre del partido) sí lo son; el 5 (Votos) es entero. No obstante si ese fuera el problema, en el resto de municipios haría lo mismo y unos lo hace bien y otros no.
Responder Con Cita
  #4  
Antiguo 06-11-2023
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
El `order by` como lo muestras esta correcto. La BD no se esta inventando eso. El problema es que no es el orden que estas buscando. Supongo que quires el `total de votos ascendente por municipio`?
__________________
El malabarista.
Responder Con Cita
  #5  
Antiguo 06-11-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por mamcx Ver Mensaje
El `order by` como lo muestras esta correcto. La BD no se esta inventando eso. El problema es que no es el orden que estas buscando. Supongo que quires el `total de votos ascendente por municipio`?
Efectivamente, eso es lo que quiero
Responder Con Cita
  #6  
Antiguo 06-11-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Es que al tener el ORDER BY 4, 5 DESC, 2 están priorizando el 4 ( NomMunicipio) antes que VotPar.
Si quieres ordenar por VotPar, entonces tendrás que poner 5, 4, etc...
Responder Con Cita
  #7  
Antiguo 07-11-2023
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Por lo que veo está bien la premisa, que el orden no parece correcto. Las columnas 4 y 5 serían "NOMMUNICIPIO" y "VOTPAR", y el resultado resumido a esas columnas es:
Código:
ABENOJAR   829
ABENOJAR   249
AGUDO      170
AGUDO      212
Pero debería ser:
Código:
ABENOJAR   829
ABENOJAR   249
AGUDO      212
AGUDO      170
Donde la segunda columna es VOTPAR y debería estar ordenada en forma descendiente para cada ministerio, pero eso no se evidencia en el segundo caso. Desde mi desconocimiento de Firebird/Interbase, pero conociendo otros motores, sospecharía si la columna municipio no tiene alguna diferencia no visible en el campo del municipio. Desde caracteres especiales hasta mas espacios al final del texto. Una forma simple de ver eso es quitar el DESC del orden, y ver si mantiene la misma lógica. Otra forma es hacer un UPDATE del primer registro, sobre el segundo. Es importante aclarar que desconozco el modelo de datos como para saber si el valor pertenece a registros distintos.

La segunda columna es el resultado de un SUM así que dudo que sea alfanumérico.
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #8  
Antiguo 07-11-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Gracias por vuestras respuestas.
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Es que al tener el ORDER BY 4, 5 DESC, 2 están priorizando el 4 ( NomMunicipio) antes que VotPar.
Si quieres ordenar por VotPar, entonces tendrás que poner 5, 4, etc...
No: necesito ordenar primero por el nombre municipio y, dentro de cada uno de ellos, por votos en orden descendente.
Cita:
Empezado por delphi.com.ar Ver Mensaje
sospecharía si la columna municipio no tiene alguna diferencia no visible en el campo del municipio
Ten en cuenta que el nombre del municipio se saca de otra tabla en el query, por lo tanto no puede haber diferencias entre las filas del mismo municipio en ese campo.
Cita:
Empezado por delphi.com.ar Ver Mensaje
Una forma simple de ver eso es quitar el DESC del orden, y ver si mantiene la misma lógica
Curiosamente si quito el DESC los que antes se ordenaban bien lo hacen mal y viceversa.

Cita:
Empezado por delphi.com.ar Ver Mensaje
Otra forma es hacer un UPDATE del primer registro, sobre el segundo.
Esto me lo tienes que explicar.

Lo único que se me ocurre es crear una tabla temporal, indexada por los campos que me interesan, y cargarla a partir de ese query.
Responder Con Cita
  #9  
Antiguo 07-11-2023
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Al usar una SELECT para calcular el dato, el motor pasa.

Encapsula todo en una SELECT y prueba.

Código SQL [-]
SELECT A.*
FROM
(
SELECT DISTINCT A.Codigo, A.Nombre, COALESCE(RDB$GET_CONTEXT('USER_TRANSACTION', 'MUNICIPIO'), 1) Municipio, C.Nombre NomMunicipio,
       (SELECT SUM(Votos) FROM Resultados WHERE CodPrv = A.CodPrv AND Partido = A.Codigo AND Proceso = B.Proceso 
           AND Mesa IN (SELECT Codigo FROM Mesas WHERE CodPrv = A.CodPrv AND Municipio = COALESCE(RDB$GET_CONTEXT('USER_TRANSACTION', 'MUNICIPIO'), 1))) VotPar,
       RDB$SET_CONTEXT('USER_TRANSACTION', 'MUNICIPIO', (SELECT FIRST 1 Municipio FROM Mesas WHERE CodPrv = B.CodPrv AND Codigo = B.Mesa ORDER BY Municipio))
FROM Partidos A
LEFT JOIN Resultados B ON A.CodPrv = B.CodPrv AND A.Codigo = B.Partido AND B.Proceso = :Proceso
LEFT JOIN Poblacion C ON A.CodPrv = C.CodPrv AND COALESCE(RDB$GET_CONTEXT('USER_TRANSACTION', 'MUNICIPIO'), 1) = C.Codigo
WHERE A.CodPrv = :PrvIns AND A.Codigo > 0 
  AND EXISTS (SELECT Municipio FROM Mesas WHERE CodPrv = B.CodPrv AND Codigo = B.Mesa)
) A
ORDER BY 4, 5 DESC, 2

Por otro lado, haces unas SELECT totalmente anárquicas, que me parece que penalizan totalmente el rendimiento.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #10  
Antiguo 07-11-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por fjcg02 Ver Mensaje
Al usar una SELECT para calcular el dato, el motor pasa.

Encapsula todo en una SELECT y prueba.
Da este error:
Código:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid command.
No column name specified for column number 6 in derived table A.
Cita:
Empezado por fjcg02 Ver Mensaje
Por otro lado, haces unas SELECT totalmente anárquicas, que me parece que penalizan totalmente el rendimiento.
No te quito la razón, y es lo que tiene haber aprendido a lo bestia directamente en "real".
Responder Con Cita
  #11  
Antiguo 07-11-2023
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Hola,

supongo que ese error te da porque no pones nombre /alias a las columnas.

Código SQL [-]
SELECT DISTINCT 
A.Codigo, 
A.Nombre, 
COALESCE(RDB$GET_CONTEXT('USER_TRANSACTION', 'MUNICIPIO'), 1) Municipio, 
C.Nombre NomMunicipio,
(SELECT SUM(Votos) FROM Resultados WHERE CodPrv = A.CodPrv AND Partido = A.Codigo AND Proceso = B.Proceso 
       AND Mesa IN (SELECT Codigo FROM Mesas WHERE CodPrv = A.CodPrv AND Municipio = COALESCE(RDB$GET_CONTEXT('USER_TRANSACTION', 'MUNICIPIO'), 1))) VotPar,
/* a partir de aqui puedes tener el problema */
RDB$SET_CONTEXT('USER_TRANSACTION', 'MUNICIPIO', (SELECT FIRST 1 Municipio FROM Mesas WHERE CodPrv = B.CodPrv AND Codigo = B.Mesa ORDER BY Municipio)
) NOMBRECOLUMNA

FROM Partidos A

Te falta bautizar alguna columna para que lo entienda, concretamente la sexta columna. (Te respondo rápido sin analizar al 100% la consulta...)

Saludos

PD: ya he visto en otro hilo que empiezas a escribir consultas de forma más estructurada. De esa manera para el motor es más fácil.
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #12  
Antiguo 07-11-2023
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por Angel.Matilla Ver Mensaje
Esto me lo tienes que explicar.
Si el nombre del municipio no salía de una tabla normalizada, y había dos registros con el mismo nombre, me refería a actualizar uno contra el otro. Pero por lo que cuentas no tiene sentido.

Solo para reforzar la idea, ¿Qué pasa si ordenas ORDER BY 4 DESC, 5, 2?.. porque si el fenómeno se repite invertido, entonces sigo sospechando del primer campo (4).
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #13  
Antiguo 07-11-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por fjcg02 Ver Mensaje
Te falta bautizar alguna columna para que lo entienda, concretamente la sexta columna. (Te respondo rápido sin analizar al 100% la consulta...)

Saludos

PD: ya he visto en otro hilo que empiezas a escribir consultas de forma más estructurada. De esa manera para el motor es más fácil.
La sexta columna del query es la definición de una variable (RDB$SET_CONTEXT('USER_TRANSACTION', 'MUNICIPIO'...), que se usa para recuperar un valor (RDB$GET_CONTEXT('USER_TRANSACTION', 'MUNICIPIO')). Fuera de eso todas las columnas están identificadas. Al margen de esa circunstancia, esa columna no interviene para nada en el ORDER BY y por lo tanto debería dar lo mismo que estuviera bautizada o no; además esa columna siempre tiene valor 1.

Última edición por Angel.Matilla fecha: 07-11-2023 a las 18:43:30.
Responder Con Cita
  #14  
Antiguo 07-11-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por delphi.com.ar Ver Mensaje
Solo para reforzar la idea, ¿Qué pasa si ordenas ORDER BY 4 DESC, 5, 2?.. porque si el fenómeno se repite invertido, entonces sigo sospechando del primer campo (4).
Hace más o menos lo mismo: Ordena bien por el nombre del municipio, perocon los votos hace lo que le da la gana.
Responder Con Cita
  #15  
Antiguo 07-11-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por delphi.com.ar Ver Mensaje
Solo para reforzar la idea, ¿Qué pasa si ordenas ORDER BY 4 DESC, 5, 2?.. porque si el fenómeno se repite invertido, entonces sigo sospechando del primer campo (4).
Para más inri todavía no veo como demonios está ordenando la salida: ni por código de partido (columna 1), ni por su nombre, ni por el código de municipio, etc. A saber que está interpretando el motor.
Añadido a esto: la tercera columna es el código de municipio y resulta que en los primeros registros que se ven ahí está el mismo nombre (VISO DEL MARQUÉS) pero hay dos códigos diferentes: 57486, que es el que le corresponde, y 1217, que es de Alcázar de San Juan. Pero encima ese 57846 aparece más adelante en Villarta de San Juan. Cada vez lo entiendo menos.

Última edición por Angel.Matilla fecha: 07-11-2023 a las 18:50:29.
Responder Con Cita
  #16  
Antiguo 07-11-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Creo que es mejor que empieces por lo básico, probar y si va bien entonces añades otra tabla, y así poco a poco.
Si falla en un momento verás dónde es. Pues al quitar lo que acabes de añadir volverá a ir bien.
No sé si puedes "anonimizar" los datos y poner la BD para que podamos probar.
Responder Con Cita
  #17  
Antiguo 08-11-2023
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Simplificado no es así?:

Código SQL [-]
WITH votos AS (
    SELECT 'POPULAR' AS partido, 'ABENOJAR' AS municipio, 829 AS votos
    UNION
    SELECT 'ALCAZAR', 'ABENOJAR', 249
    UNION
    SELECT 'POPULAR', 'AGUDO', 170
    UNION
    SELECT 'ALCAZAR', 'AGUDO', 212
)

SELECT municipio, partido, votos FROM votos
ORDER BY municipio, votos ASC, partido;


Código:
| municipio | partido | votos |
| --------- | ------- | ----- |
| ABENOJAR  | ALCAZAR | 249   |
| ABENOJAR  | POPULAR | 829   |
| AGUDO     | POPULAR | 170   |
| AGUDO     | ALCAZAR | 212   |
__________________
El malabarista.
Responder Con Cita
  #18  
Antiguo 08-11-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por mamcx Ver Mensaje
Simplificado no es así?
¡Madre mía! Eso que sugieres ¿es recorrer toda la tabla e ir haciendo las asignaciones pertinentes?
Responder Con Cita
  #19  
Antiguo 08-11-2023
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
No. solo puse un ejemplo reducido.
__________________
El malabarista.
Responder Con Cita
  #20  
Antiguo 08-11-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por mamcx Ver Mensaje
No. solo puse un ejemplo reducido.
De todas maneras, lo que sugieres es ir leyendo todo para ponerlo en el SELECT. No tiene sentido o yo no he entendido la sugerencia.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
No funciona ORDER BY desc LIMIT franroju PHP 2 28-03-2013 14:08:44
funciona bien en windows 7 64b pero en XP no funciona ASAPLTDA Varios 5 06-05-2011 16:24:50
order by no funciona con datetime... User_baja1 SQL 1 17-05-2005 12:37:17
ORDER BY en Rave con parametro NO funciona !. Luis Impresión 0 05-01-2005 18:01:19
Order by ...... chutipascal Firebird e Interbase 8 24-06-2003 14:46:21


La franja horaria es GMT +2. Ahora son las 21:03:57.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi