Ver Mensaje Individual
  #5 (permalink)  
Antiguo 10/06/2008, 05:42
MutenRo
 
Fecha de Ingreso: marzo-2008
Ubicación: Euskadi
Mensajes: 64
Antigüedad: 16 años, 7 meses
Puntos: 0
Respuesta: ¿bug en Oracle 10g con ROLLUP y ORDER BY?

Hola,

voy a intentar aclarar algunas cosas.

Cita:
Perdon, per sigo sin ver el sentido de los puntos que comente, en cuanto al orden esta garantizado por la operacion SORT GROUP BY ROLLUP.
El punto 1 creo que está claro, no es lo mismo hacer GROUP BY ROLLUP(A), B que hacer GROUP BY ROLLUP(A,B). El primero es para obtener totales independientemente de A pero agrupados por B y el segundo es para obtener totales parciales agrupados por A independientemente de B y además los totales independientemente de A y B. Un ejemplo sería:

Código:
SELECT A, B, COUNT(C) AS C
FROM (
SELECT 1 AS A, 3 AS B, 2 AS C FROM DUAL
UNION ALL
SELECT 1 AS A, 3 AS B, 3 AS C FROM DUAL
UNION ALL
SELECT 2 AS A, 1 AS B, 2 AS C FROM DUAL
UNION ALL
SELECT 2 AS A, 3 AS B, 3 AS C FROM DUAL
)
GROUP BY ROLLUP(A, B)
esto nos devuelve:

Cita:
A B C
1 3 2
1 null 2
2 1 1
2 3 1
2 null 2
null null 4
y en el EXPLAIN PLAN vemos que efectivamente hace un SORT GROUP BY ROLLUP, de manera que los totales parciales aparecen ordenados y al final el 'total de totales', pero eso no significa que esté ordenado como yo quiero (punto 2), de hecho si añado un ORDER BY B obtengo:

Cita:
A B C
2 1 1
2 3 1
1 3 2
1 null 2
null null 4
2 null 2
lo cual es correcto, y además en el EXPLAIN PLAN vemos que tras hacer SORT GROUP BY ROLLUP, también hace SORT ORDER BY (estrictamente sobraba hacer el SORT GROUP BY ROLLUP, pero eso es otro asunto). El resultado es correcto.

Ahora volvamos a la consulta problemática, con el COUNT(DISTINCT C) y ROLLUP(A), B:

Código:
SELECT A, B, COUNT(DISTINCT C) AS C
FROM (
SELECT 1 AS A, 3 AS B, 2 AS C FROM DUAL
UNION ALL
SELECT 1 AS A, 3 AS B, 3 AS C FROM DUAL
UNION ALL
SELECT 2 AS A, 1 AS B, 2 AS C FROM DUAL
UNION ALL
SELECT 2 AS A, 3 AS B, 3 AS C FROM DUAL
)
GROUP BY ROLLUP(A), B
devuelve:

Cita:
A B C
2 1 1
1 3 2
2 3 1
null 1 1
null 3 2
lo cual es correcto pero se ve algo extraño: a diferencia de la consulta anterior o de cuando hacemos COUNT(C) simplemente, vemos que los totales están al final, es decir, aunque ha efectuado un SORT GROUP BY ROLLUP, la fila (null,1,1) no está en segundo lugar sino que está al final. No digo que esto sea incorrecto porque en principio no tiene por qué garantizar un orden, pero cuando añadimos ORDER BY B, el resultado es:

Cita:
A B C
2 1 1
1 3 2
2 3 1
null 1 1
null 3 2
lo cual es claramente incorrecto.