grouping sets

24/05/2005 - 16:37 por Mauro | Informe spam
alguien conoce como se usa el grouping set, busque en los BOL
pero no encontre nada

Preguntas similare

Leer las respuestas

#1 Maxi
24/05/2005 - 17:31 | Informe spam
Que es el grouping set?


Salu2
Maxi


"Mauro" escribió en el mensaje
news:
alguien conoce como se usa el grouping set, busque en los BOL
pero no encontre nada


Respuesta Responder a este mensaje
#2 Mauro
24/05/2005 - 17:46 | Informe spam
jeje, aparentemente no existe en sql es de oracle. la idea es hacer un
rollup parcial.
conocen alguna forma?
"Maxi" wrote in message
news:%
Que es el grouping set?


Salu2
Maxi


"Mauro" escribió en el mensaje
news:
> alguien conoce como se usa el grouping set, busque en los BOL
> pero no encontre nada
>
>


Respuesta Responder a este mensaje
#3 Alejandro Mesa
24/05/2005 - 17:48 | Informe spam
Mauro,

Si te refieres a la palabra clave "GROUPING", esta es una funcion de
agrupacion que se utiliza en sentencias select donde usas la clausula "GROUP
BY ... WITH ROLLUP" y la cual devuelve 1 o 0 si la fila fue adicionada o no
por el operador rollup (tambien puede ser el operador CUBE). Vamos a ver un
ejemplo.

Ejemplo:

Selecionar el año, el cliente y la cantidad de ordenes de ese cliente en ese
año, desde la tabla [orders] en la bd [northwind]. Se quiere una fila de
subtotal por año y un gran total.

select
year(orderdate) order_year,
customerid,
count(*) as cnt_orders
from
dbo.orders
group by
year(orderdate),
customerid with rollup

Pero como tu sabes, si no usamos la clausula "order by" entonces sql server
no garantiza que el resultado este ordenado. Que pasa cuando adicionamos la
clausula "order by", veamos:

select
year(orderdate) order_year,
customerid,
count(*) as cnt_orders
from
dbo.orders
group by
year(orderdate),
customerid with rollup
order by
year(orderdate),
customerid

El resultado cambia drasticamente porque sql server le da preferencia a los
valores NULL y el resultado se descuadra (ESTO ES UN EJEMPLO, NO ESTOY
SUGIRIENDO QUE SE HAGA EN EL LADO DEL SERVIDOR, como siempre, esto se debe
hacer en la herramienta de reportes que se este usando). Como lo podemos
arreglar?. Una opcion es usando la funcion GROUPING.

select
year(orderdate) order_year,
customerid,
count(*) as cnt_orders
from
dbo.orders
group by
year(orderdate),
customerid with rollup
order by
case when grouping(year(orderdate)) = 1 then 1 else 0 end,
year(orderdate),
case when grouping(customerid) = 1 then 1 else 0 end,
customerid

Dejame ver si no me trabo tratando de explicar la clausula "order by".
Estamos usando cuatro grupos para ordenar el resultado. El primero es basado
en la expresion:

case when grouping(year(orderdate)) = 1 then 1 else 0 end

Lo cual es verdad en la fila del gran total, por lo que como queremos esa
fila al final, entonces devolvemos el valor 1 de lo contrario 0. El proximo
grupo es el año de la orden. Despues le sigue:

case when grouping(customerid) = 1 then 1 else 0 end

lo cual es verdad cuando se genera la fila de subtotal para el año, y como
por cada año queremos el subtotal al final, entonces hacemos lo mismo 1 para
el subtotal y cero para el resto. El ultimo grupo es por customerid.

Espero que te ayude.


AMB

"Mauro" wrote:

alguien conoce como se usa el grouping set, busque en los BOL
pero no encontre nada



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida