Ordenar consulta por dos campos

24/07/2003 - 14:20 por Jon Bilbao | Informe spam
Quiero hacer una consulta que el resultado se ordene mediante dos campos de
la siguiente forma (ejemplo):

C1 C2

1 1
2 1
3 1
4 1 <5 2 <4 1 <5 2 <6 1
7 1

La consulta SQL -- "SELECT * FROM Tabla order by C1,C2" -- me da:

C1 C2

1 1
2 1
3 1
4 1 <4 2 <5 1 <5 2 <6 1
7 1

y la consulta SQL -- "SELECT * FROM Tabla order by C2,C1" -- me da:

C1 C2

1 1
2 1
3 1
4 1 <5 1 <6 1
7 1
4 2 <5 2 <
Ninguno de los dos casos es correcto y el orden de presentación es muy
importante. ¿Alguien sabría como orientar la consulta para que el orden de
presentación fuese el correcto?

Gracias por anticipado.

Nota: Esta consulta se conecta con un DataGrid

Preguntas similare

Leer las respuestas

#1 Tako
24/07/2003 - 14:20 | Informe spam
"Jon Bilbao" wrote in message
news:%
Quiero hacer una consulta que el resultado se ordene mediante dos campos


de
la siguiente forma (ejemplo):

C1 C2

1 1
2 1
3 1
4 1 <> 5 2 <> 4 1 <> 5 2 <> 6 1
7 1



Francamente no entiendo el criterio de ordenación que has aplicado,
¿podrías explicarlo algo más detalladamente?
Respuesta Responder a este mensaje
#2 Jon Bilbao
24/07/2003 - 18:45 | Informe spam
Gracias por tu interés.

Efectivamente, la información que proporciono no es suficiente y además
tengo un error en la exposición. Lo que pasa es que busco un criterio de
ordenación y todavía no sé como plantearlo, así que estoy algo perdido y no
me explico bien (pido disculpas).

En realidad, la consulta pretende generar unas fichas donde se cruza
información de diversas tablas. Como resultado de esta consulta hay unos 20
campos y entre ellos hay tres que tienen relación con el problema del orden
que planteo.

Básicamente, la aplicación tiene definidas unas "Plantillas" base,
constituidas por líneas, que proporcionan la estructura de la ficha. En la
tabla de plantillas encontraremos registros que identifican líneas de estas
plantillas, pero estas plantillas deben rellenarse de datos para que tengan
utilidad.

Las tablas de datos asocian líneas de "Datos" que se relacionan con las
líneas de plantillas anteriores, de forma que combinándolas creamos las
fichas de datos propias de cada elemento. Inicialmente cada línea de datos
sólo se podía corresponder con una línea de plantilla. Además, los elementos
que van a ser mostrados en una ficha presentan agrupaciones funcionales
asociados a tramos de la ficha y esta agrupación en realidad está
relacionada con la disposición de la plantilla por lo cual existe un campo
en la tabla de "Plantillas" llamémosle "C3" numérico que identifica estas
agrupaciones (esta explicación faltaba en mi planteamiento inicial). El
hecho, es que estas agrupaciones se muestran siempre unidas en la ficha
(porque el usuario las define en el orden correcto).

Una modificación reciente ha introducido un nuevo concepto que ha complicado
este funcionamiento. Se trata de una subdivisión de esta agrupación anterior
que denominaremos "subgrupo" y se identifica como el campo C2 en mi
planteamiento. Esta subdivisión de el agrupamiento original depende en este
caso de características de los elementos afectados y por lo tanto el campo
se encuentra en la tabla de "Datos". Al tratarse de una subdivisión del
grupo se espera que la línea de plantilla se duplique con los datos
respectivos de cada subgrupo.

Llegados a este punto es cuando planteo el orden en que se debe rellenar la
ficha de datos: Hasta ahora utilizaba el campo orden de la plantilla para
organizar la ficha, ahora hay líneas de la plantilla que se duplican pero al
mantener el mismo criterio de orden sale cada línea junto a su duplicada. El
caso es que interesa que las líneas de cada subGrupo aparezcan unidas por su
parte (normalmente) y no intercaladas. Se que es un problema, he intentado
buscar una forma de reordenar "a mano" el RecorSet pero no veo la manera. Si
fuera posible cambiar la posición original de los registros manualmente sin
afectar a los datos podría ser una solución.

Las tablas resumidas son

Datos Plantilla
idLinea idLinea
subGrupo(C2) Grupo (C3)
Dato1 orden (C1)
Parametro1
... ...


El resultado deseado, corregido y ampliado es:

C3 C1 C2 Grupo Orden SubGrupo
-
1 1 1 Primero Param1 Primero
1 2 1 Primero Param2 Primero
1 3 1 Primero Param2 Primero
2 4 1 <= Segundo Param1 Segundo
2 5 1 <= Segundo Param2 Segundo
2 4 2 <= Segundo Param1 SegundoBIS
2 5 2 <= Segundo Param2 SegundoBIS
3 6 1 Tercero Param1 Tercero
3 7 1 Tercero Param2 Tercero

y lo que estoy obteniendo es:


C3 C1 C2 Grupo Orden SubGrupo
-
1 1 1 Primero Param1 Primero
1 2 1 Primero Param2 Primero
1 3 1 Primero Param2 Primero
2 4 1 <= Segundo Param1 Segundo
2 4 2 <= Segundo Param1 SegundoBIS
2 5 1 <= Segundo Param2 Segundo
2 5 2 <= Segundo Param2 SegundoBIS
3 6 1 Tercero Param1 Tercero
3 7 1 Tercero Param2 Tercero

Gracias.

==


"Tako" escribió en el mensaje
news:u2Q%

"Jon Bilbao" wrote in message
news:%
> Quiero hacer una consulta que el resultado se ordene mediante dos campos
de
> la siguiente forma (ejemplo):
>
> C1 C2
>
> 1 1
> 2 1
> 3 1
> 4 1 <> > 5 2 <> > 4 1 <> > 5 2 <> > 6 1
> 7 1

Francamente no entiendo el criterio de ordenación que has aplicado,
¿podrías explicarlo algo más detalladamente?


Respuesta Responder a este mensaje
#3 Miguel Egea
24/07/2003 - 23:28 | Informe spam
Francamente Jon, soy incapaz de leer y entender tanto a estas horas, pero
para el caso concreto creo que te valdrá esto
seelect xxx from xxx
order by c3,cast(c2 as char(2))+cast(c1 as char(2))

Pruebalo y nos cuentas.


Un Saludo
Miguel Egea
http://www.portalsql.com
Microsoft SQL-SERVER MVP.

C3 C1 C2 Grupo Orden SubGrupo
-
1 1 1 Primero Param1 Primero
1 2 1 Primero Param2 Primero
1 3 1 Primero Param2 Primero
2 4 1 <= Segundo Param1 Segundo
2 5 1 <= Segundo Param2 Segundo
2 4 2 <= Segundo Param1 SegundoBIS
2 5 2 <= Segundo Param2 SegundoBIS
3 6 1 Tercero Param1 Tercero
3 7 1 Tercero Param2 Tercero

Respuesta Responder a este mensaje
#4 Julio C. Briceño R.
25/07/2003 - 18:12 | Informe spam
Saludos,

Amigo, es bastante confuso y larga tu explicación, creo
que debes explicarte mejor y más concisamente.

Hasta luego,


Gracias por tu interés.

Efectivamente, la información que proporciono no es


suficiente y además
tengo un error en la exposición. Lo que pasa es que busco


un criterio de
ordenación y todavía no sé como plantearlo, así que estoy


algo perdido y no
me explico bien (pido disculpas).

En realidad, la consulta pretende generar unas fichas


donde se cruza
información de diversas tablas. Como resultado de esta


consulta hay unos 20
campos y entre ellos hay tres que tienen relación con el


problema del orden
que planteo.

Básicamente, la aplicación tiene definidas


unas "Plantillas" base,
constituidas por líneas, que proporcionan la estructura


de la ficha. En la
tabla de plantillas encontraremos registros que


identifican líneas de estas
plantillas, pero estas plantillas deben rellenarse de


datos para que tengan
utilidad.

Las tablas de datos asocian líneas de "Datos" que se


relacionan con las
líneas de plantillas anteriores, de forma que


combinándolas creamos las
fichas de datos propias de cada elemento. Inicialmente


cada línea de datos
sólo se podía corresponder con una línea de plantilla.


Además, los elementos
que van a ser mostrados en una ficha presentan


agrupaciones funcionales
asociados a tramos de la ficha y esta agrupación en


realidad está
relacionada con la disposición de la plantilla por lo


cual existe un campo
en la tabla de "Plantillas" llamémosle "C3" numérico que


identifica estas
agrupaciones (esta explicación faltaba en mi


planteamiento inicial). El
hecho, es que estas agrupaciones se muestran siempre


unidas en la ficha
(porque el usuario las define en el orden correcto).

Una modificación reciente ha introducido un nuevo


concepto que ha complicado
este funcionamiento. Se trata de una subdivisión de esta


agrupación anterior
que denominaremos "subgrupo" y se identifica como el


campo C2 en mi
planteamiento. Esta subdivisión de el agrupamiento


original depende en este
caso de características de los elementos afectados y por


lo tanto el campo
se encuentra en la tabla de "Datos". Al tratarse de una


subdivisión del
grupo se espera que la línea de plantilla se duplique con


los datos
respectivos de cada subgrupo.

Llegados a este punto es cuando planteo el orden en que


se debe rellenar la
ficha de datos: Hasta ahora utilizaba el campo orden de


la plantilla para
organizar la ficha, ahora hay líneas de la plantilla que


se duplican pero al
mantener el mismo criterio de orden sale cada línea junto


a su duplicada. El
caso es que interesa que las líneas de cada subGrupo


aparezcan unidas por su
parte (normalmente) y no intercaladas. Se que es un


problema, he intentado
buscar una forma de reordenar "a mano" el RecorSet pero


no veo la manera. Si
fuera posible cambiar la posición original de los


registros manualmente sin
afectar a los datos podría ser una solución.

Las tablas resumidas son

Datos Plantilla
idLinea idLinea
subGrupo(C2) Grupo (C3)
Dato1 orden (C1)
. Parametro1
...


El resultado deseado, corregido y ampliado es:

C3 C1 C2 Grupo


Orden SubGrupo
1 1 1 Primero


Param1 Primero
1 2 1 Primero


Param2 Primero
1 3 1 Primero


Param2 Primero
2 4 1 <= Segundo


Param1 Segundo
2 5 1 <= Segundo


Param2 Segundo
2 4 2 <= Segundo


Param1 SegundoBIS
2 5 2 <= Segundo


Param2 SegundoBIS
3 6 1 Tercero


Param1 Tercero
3 7 1 Tercero


Param2 Tercero

y lo que estoy obteniendo es:


C3 C1 C2 Grupo


Orden SubGrupo
1 1 1 Primero


Param1 Primero
1 2 1 Primero


Param2 Primero
1 3 1 Primero


Param2 Primero
2 4 1 <= Segundo


Param1 Segundo
2 4 2 <= Segundo


Param1 SegundoBIS
2 5 1 <= Segundo


Param2 Segundo
2 5 2 <= Segundo


Param2 SegundoBIS
3 6 1 Tercero


Param1 Tercero
3 7 1 Tercero


Param2 Tercero

Gracias.

==>==>


"Tako" escribió en el mensaje
news:u2Q%

"Jon Bilbao" wrote in message
news:%
> Quiero hacer una consulta que el resultado se ordene




mediante dos campos
de
> la siguiente forma (ejemplo):
>
> C1 C2
>
> 1 1
> 2 1
> 3 1
> 4 1 <>> > 5 2 <>> > 4 1 <>> > 5 2 <>> > 6 1
> 7 1

Francamente no entiendo el criterio de ordenación




que has aplicado,
¿podrías explicarlo algo más detalladamente?






.

Respuesta Responder a este mensaje
#5 Jon Bilbao
28/07/2003 - 18:50 | Informe spam
Pido disculpas por la dificultad que tengo en plantear mi pregunta y por el
trabajo que os causo. Intentaré ser más claro:

Resumiendo un poco, dispongo de tres tablas, FICHAS, PANTILLAS y DATOS y los
campos más relevantes de ellas para nuestra cuestión son:

FICHAS PLANTILLAS DATOS
idFicha idLinea idLinea
idLinea ordenLinea idElemento
Grupo subGrupo
Texto1 Dato1
Texto2 Dato2
...

Si queremos mostrar la ficha=1 del elemento=1, en la tabla FICHAS
obtendremos la lista de lineas idLinea asignadas a idFicha=1 que la componen
y se encuentran en la tabla PLANTILLAS (son únicas). Para rellenar de datos
esta ficha encontraremos datos específicos para el elemento=1 en la tabla
DATOS donde se establece la relación entre los datos de cada elemento y la
linea de plantilla donde deben alojarse. Normalmente para cada linea de
plantilla un elemento solo contiene una línea de datos por lo cual la
estructura final de la ficha coincide con la plantilla, pero debido a
modificaciones actuales (causantes de mi problema) puede haber elementos que
presenten DOS lineas de datos asociadas a la misma línea de plantilla.
Resultado: se duplica la misma linea de plantilla generando dos líneas en la
ficha (cada una con sus datos de subGrupo).

Hasta aquí todo va bien y según lo previsto, el problema surge con el orden
de presentación de las líneas en la ficha final. En la tabla PLANTILLA hay
un campo "ordenLinea" que indica el orden de presentación que deben tener
las distintas líneas de la ficha y este criterio, en principio, es correcto
pero cuando aparecen duplicaciones de líneas debidas a los subGrupos el
sistema de orden actual no se corresponde con lo deseado y de hecho mi
problema es ese: No encuentro una forma de asignar un criterio de orden
nuevo que respete lo anterior y asigne el orden correcto para las líneas
duplicadas.

Mi primer intento ha sido aplicar un "ORDER BY ordenLinea, SubGrupo" pero el
resultado no es correcto. Para entender lo que necesito explico lo de Grupos
y subGrupos: Los elementos de esta base de datos presentan su información
agrupada y esto se representa en la tabla PLANTILLAS mediante el campo
Grupos, puesto que esto depende exclusivamente de la posición en la ficha
(ver Nota de solución mía). En cuanto al campo subGrupo es una subdivisión
dentro del grupo (como indica su nombre) pero esta se debe a determinados
rangos de valores para elementos concretos. Como la aparición de subGrupos
implica la duplicidad de datos parece lógico ubicar este campo en la tabla
DATOS.

Una pega sobre la propuesta de Miguel Egea: El campo Grupo (que antes
denominaba C3) no sirve actualmente para ordenar, ya que en el planteamiento
actual solo sirve como criterio de agrupacion (puesto que el orden ya lo
indican las propias lineas de la plantilla). Sin embargo empiezo a pensar
que tendre que cambiar algo sobre este punto. De momento los unicos campos
cuyo valor esta relacionado con el orden de presentacion son "ordenLinea" y
"subGrupo"

Un ejemplo de la ficha esperada es:

Grupo OrdenLinea SubGrupo
-
Primero Param1 Primero
Primero Param2 Primero
Primero Param2 Primero

Segundo Param1 Segundo
Segundo Param2 Segundo
Segundo Param1 SegundoBIS
Segundo Param2 SegundoBIS

Tercero Param1 Tercero
Tercero Param2 Tercero

Y desde luego aplicando el criterio "ORDER BY ordenLinea, SubGrupo" el
resultado es (ver el grupo Segundo):

Grupo OrdenLinea SubGrupo
-
Primero Param1 Primero
Primero Param2 Primero
Primero Param2 Primero


Segundo Param1 Segundo
Segundo Param1 SegundoBIS
Segundo Param2 Segundo
Segundo Param2 SegundoBIS


Tercero Param1 Tercero
Tercero Param2 Tercero


Nota de Solución mía: He valorado la posibilidad de crear una tabla
intermedia denominada GRUPOS entre FICHAS y PLANTILLAS, lo que probablemente
resolviese mis problemas, ya que el criterio de orden "ORDER BY ordenGrupo,
subGrupo,ordenLinea" sería válido con toda seguridad. Pero resulta muy
complejo de ejecutar ya que implica reformar buena parte del código.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida