Professional Documents
Culture Documents
Anuncios Google SQL Oracle SQL Class Rollup SQL Server Cube
¡votar! Internet
Anuncios Google Anuncios Google 1 .
Introducción Lenguajes de script
MS Access SQL SQL Software 2 .
Primera pregunta: ¿Cuántos transacciones tenemos de entrada y de salida?
3 .
Segunda Pregunta: ¿Qué divisa es la más usada? Lenguajes imperativos
SQL Tutorial Rollup
4 .
Tercera pregunta: ¿Cantidad de cada tipo de transacción en cada tipo de divisa?
SQL Server Manual SQL 5 .
Cuarta pregunta: ¿Y si quiero la información agrupada de más maneras?
Lenguajes orientados a
SQL Download SQL Editor objeto
6 .
Quinta pregunta: ¿cómo sabemos cual de los NULL es un super agregado y cual es un NULL
de verdad? Otros lenguajes
7 . Sexta pregunta: ¿Podemos mejorar el aspecto del resultado?
8 . Séptima pregunta: ¿Podemos saberlo todo? Plataformas
9 . Octava pregunta: ¿Y qué pasa con el ROLLUP?
10 . Novena pregunta: ¿Esto se parece al COMPUTE BY verdad? Teoría
11 . Décima pregunta: Muy bonito todo esto, pero si lo hago con un montón de datos en
varias tablas, ¿no será muy lento? Varios
12 . Última pregunta: ¿Es esto todo?
Introducción
Cuando tenemos que mostrar información de nuestra base de datos a los usuarios
habitualmente creamos informes con Visual Basic, con Crystal Reports, con los Analysis Services
Últimas
de Microsoft SQL Server 2000 o con lo que queramos. Con estas herramientas podemos realizar
cualquier tipo de cálculo sobre los datos almacenados, y especialmente calcular sumas, totales,
noticias
promedios. . . · Lotusphere llega a su
Pero el lenguaje SQL también nos proporciona herramientas para hacer la mayor parte del ciudad 2011
trabajo en el servidor (ahorrándonos posteriores problemas). Como ya conoceréis tenemos
cláusulas como GROUP BY para agrupar, las funciones de agregado para contar, sumar, · Web Camps 2011
www.xoom.com/espanol Anuncios Google promediar. y la cláusula COMPUTE BY para hacer resúmenes. ¿Y si queremos calcular subtotales
y totales generales en una misma consulta? Pues también existen las cláusulas CUBE y ROLLUP · Morfeo Fussion 2011
que son las que vamos a tratar aquí.
· Geany, un IDE
Programación en Castellano on ¿Qué preguntas solucionamos con CUBE y ROLLUP? multiplataformas
Facebook
Vamos a trabajar con la siguiente tabla por no complicar los ejemplos ni el código SQL. Además
Like una tabla como esta aunque no sea real sirve perfectamente para mostrar como funciona W ITH Ver más
CUBE.
15 people like Programación en Castellano. Id TipoTransaccion Divisa Cantidad
------------- -------------------- ---------------- -----------
1 Entrada Euro 200 Últimos
2 Entrada Euro 1300
F rikizhita Tania Rotundo C arlos A ndres Roberto
3 Salida Dolar 2000 artículos
4 Entrada Libra 500
5 Salida Dolar 1000 · Evento Pan Windows
Phone 7
6 Entrada Euro 300
7 Entrada Dolar 5000 · Evento Double Tap
Jav Jesús Jose Hector Luis
8 Salida Libra 500 Windows Phone 7
9 Entrada Euro 700
10 Entrada Libra 400 · Evento Tap en Windows
F acebook social plugin 11 Entrada Yen 20000 Phone 7
12 Salida Libra 300 · Developer Tools en
13 Entrada Euro 4000 Internet Explorer 9 (II de
14 Salida Yen 30000 VII)
15 Entrada Libra 3000
16 Entrada Euro 400 Ver más
17 Entrada Euro 900
18 Salida Dolar 4000
19 Entrada Dolar 1200
20
21
Salida
Entrada
Libra
Euro
900
2100 Últimos
22
23
Entrada
Entrada
Libra
Yen
200
25000 códigos
24 Entrada Libra 400 · Mascara para Text (SWT)
25 Entrada Euro 700
26 Entrada NULL 2000 · Convierte cursor de lectura
(26 filas afectadas) en cursor de escritura
Es una tabla en la que se guarda información sobre transacciones económicas en las que
tenemos tres tipos de datos. Si la transacción es de entrada o de salida, la moneda en la que se · Tres en Raya o Juego del
hace y la cantidad. Ahora vamos a empezar a hacer preguntas de tipo OLAP (on-line analytical Gato
processing) para analizar los datos que tenemos almacenados. · Consultar BD MySQL
Primera pregunta: ¿Cuántos transacciones tenemos de utilizando POO
converted by Web2PDFConvert.com
The World's Leading
(2 filas afectadas) Art & Antiques Fair in
Segunda Pregunta: ¿Qué divisa es la más usada? Maastricht. TEFAF
2011 !
Esta es un poco más elaborada pero de nuevo nos basta con usar un GROUP BY. También www.TEFAF.com /ArtEx hibition
utilizamos TOP 1 para quedarnos sólo con el valor más alto después de ordenar la suma de
manera descendente. Aqua Data Studio
SELECT TOP 1 Divisa, SUM(Cantidad) Suma OracleDB
FROM Movimientos GROUP BY Divisa OracleDB
ORDER BY SUM(Cantidad) DESC Query&Administration
Divisa Suma Too Download Now!
-------------------------------------- ----------- Windows, Linux, OSX
Yen 75000 www.aquafold.com /oracle
(1 filas afectadas)
MS SQL Recovery
SW
Tercera pregunta: ¿Cantidad de cada tipo de transacción Recover Corrupt MDF
en cada tipo de divisa? Database Files Instant
Recovery, Free Demo
Aquí tenemos que agrupar por TipoTransaccion y Divisa para obtener la suma de las cantidades Preview
por esos conceptos. Podemos ver cuantos Euros han salido o cuantos dólares han entrado. www.m ssqldatabaserecovery.com
SELECT TipoTransaccion, Divisa, SUM(Cantidad) Cantidad
FROM Movimientos GROUP BY TipoTransaccion, Divisa cotizacion
ORDER BY TipoTransaccion dolar/euro
¿Buscas cotizacion
TipoTransaccion Divisa Cantidad dolar/euro? Consigue
--------------------------- ------------------ ----------- Mejores Resultados
Entrada Dolar 6200 con ASK
Entrada Euro 10600 www.Ask .com
Entrada Libra 4500
Entrada Yen 45000 Trading System at
Salida Dolar 7000 Work
Salida Libra 1700 Many Pose As Trading
Salida Yen 30000 Gurus Few Display
(7 filas afectadas) Their Trading Results
www.traderm ood.com
Sin embargo esto no responde a todas las preguntas que podemos hacer.
Cuarta pregunta: ¿Y si quiero la información agrupada de
más maneras?
Por ejemplo para saber el total entrante, o el balance de Yenes habrá que hacer cálculos
adicionales o bien con nuevas consultas o bien en nuestra aplicación cliente. Pero ahora
tenemos W ITH CUBE que nos permite crear nuevas dimensiones en nuestras consultas. Cuando
usamos esta cláusula es como si estuviésemos haciendo a la vez todos los GROUP BY posibles y
además mostrándolos en un único resultset. Añadamos el W ITH CUBE a la sentencia anterior
SELECT TipoTransaccion, Divisa, SUM(Cantidad) Cantidad
FROM Movimientos GROUP BY TipoTransaccion, Divisa
WITH CUBE
TipoTransaccion Divisa Cantidad
------------------------------ ------------------ -----------
Entrada Dolar 6200
Entrada Euro 10600
Entrada Libra 4500
Entrada Yen 45000
Entrada NULL 66300
Salida Dolar 7000
Salida Libra 1700
Salida Yen 30000
Salida NULL 38700
NULL NULL 105000
NULL Dolar 13200
NULL Euro 10600
NULL Libra 6200
NULL Yen 75000
(14 filas afectadas)
Aquí hay unos cuantos cambios. Primero vemos que sin necesidad de decirlo los datos se han
ordenado por TipoTransaccion y dentro de TipoTransaccion por Divisa. Además aparecen varios
NULL por el medio de la tabla. Pero no os preocupéis que todo va bien y vamos a explicar este
resultado con calma. Ahora cada fila es una de las posibles combinaciones de TipoTransaccion
con Divisa, y las filas que contienen un NULL se tienen que leer pensando que donde está el
NULL debería poner "todas". Es decir la fila
NULL Dolar 13200
Quiere decir que la cantidad total de Dólares tanto en entradas como en salidas (todos los
TiposTransaccipn) es 13200 La fila
Entrada NULL 66300
Quiere decir que hay un valor total de 66300 para todas las entradas (es decir, para todas las
divisas) y por último la fila
NULL NULL 105000
Nos indica que el total de movimientos (todos los TipoTransaccion) de entrada y salida en
cualquier divisa (todas las divisas) es de 105000
Como vemos el NULL representa un super agregado en la columna en la que está colocado.
Este tipo de NULL no lo debemos confundir con un NULL normal. Ya sabéis que un NULL normal
indica que desconocemos el valor mientras que este NULL indica una agrupación.
Vamos a insertar una nueva fila en nuestra tabla
INSERT INTO Movimientos (TipoTransaccion, Divisa, Cantidad)
VALUES ('Entrada', NULL, 2000)
¿Qué ocurre ahora si repetimos la consulta?
Quinta pregunta: ¿cómo sabemos cual de los NULL es un
super agregado y cual es un NULL de verdad?
Hay una función llamada GROUPING que nos dice cuando nuestro NULL es de verdad y cuando
no. Esta función nos devuelve un 1 si el nombre de la columna pasada como parámetro se usa
como resumen y un 0 si no es así. Veamos un ejemplo
SELECT TipoTransaccion,
Divisa, 'Todas las Divisas'=GROUPING(Divisa),
converted by Web2PDFConvert.com
SUM(Cantidad) Cantidad
FROM Movimientos GROUP BY TipoTransaccion, Divisa
WITH CUBE
Como veis hay dos tipos de NULL en la columna de divisas. Las que corresponden al último
registro que insertamos que tiene un NULL en divisa, y al que la función GROUPING le asocia un
0, y el NULL que podemos traducir por "Todas las divisas" al que la función GROUPING le asocia
un 1.
Sexta pregunta: ¿Podemos mejorar el aspecto del
resultado?
Ahora mezclamos estas funciones nuevas con dos funciones conocidas, CASE e ISNULL para
darle un aspecto más elegante al Resulset obtenido.
SELECT TipoTransaccion,
'Divisa'= CASE
WHEN GROUPING(Divisa)=1 THEN 'Todas'
ELSE ISNULL(Divisa, 'N/D')
END,
SUM(Cantidad) Cantidad
FROM Movimientos GROUP BY TipoTransaccion, Divisa
WITH CUBE
Todo queda más claro en este resultado. Donde pone "todas" en la columna de divisas quiere
decir precisamente eso, y donde pone "N/D" pues quiere decir no disponible.
Séptima pregunta: ¿Podemos saberlo todo?
Pues ahora ya sí. Vamos a poner la consulta que nos devuelve toda la información que podemos
pedir a los datos iniciales.
SELECT 'TipoTransacion'= CASE
WHEN GROUPING(TipoTransaccion)=1 THEN 'Todas'
ELSE ISNULL(TipoTransaccion, 'N/D')
END,
'Divisa'= CASE
WHEN GROUPING(Divisa)=1 THEN 'Todas'
ELSE ISNULL(Divisa, 'N/D')
END,
SUM(Cantidad) Cantidad
FROM Movimientos GROUP BY TipoTransaccion, Divisa
WITH CUBE
converted by Web2PDFConvert.com
(16 filas afectadas)
De esta consulta podemos sacar todas las respuestas a cualquier pregunta que nos hagan sobre
los datos iniciales.
Octava pregunta: ¿Y qué pasa con el ROLLUP?
Mientras que W ITH CUBE genera un conjunto de resultados que muestra agregados para todas
las combinaciones de valores de las columnas seleccionadas, W HIT ROLLUP genera un conjunto
de resultados que muestra agregados para una jerarquía de valores de las columnas
seleccionadas.
Es decir, con CUBE aparecen los resultado totalizados por TipoTransaccion, por Divisa, y por
totales absolutos, mientras que con ROLLUP sólo aparecerían los totales agrupados por lo que
nosostros indiquemos. Veámoslo agrupando por TipoTransaccion:
SELECT 'TipoTransacion'= CASE
WHEN GROUPING(TipoTransaccion)=1 THEN 'Todas'
ELSE ISNULL(TipoTransaccion, 'N/D')
END,
'Divisa'= CASE
WHEN GROUPING(Divisa)=1 THEN 'Todas'
ELSE ISNULL(Divisa, 'N/D')
END,
SUM(Cantidad) Cantidad
FROM Movimientos
GROUP BY TipoTransaccion, Divisa
WITH ROLLUP
Obtenemos menos información que con W ITH CUBE pero de manera más clara. Además
muchas veces con esto será suficiente
Novena pregunta: ¿Esto se parece al COMPUTE BY
verdad?
MEste tipo de consultas a alguno le traerá a la memoria una cláusula de SQL Server llamada
COMPUTE BY, que hace prácticamente lo mismo pero de diferente manera. Ejecutemos esta
consulta
SELECT TipoTransaccion, Divisa, Cantidad
FROM Movimientos
ORDER BY TipoTransaccion, Divisa
COMPUTE SUM(Cantidad) BY TipoTransaccion, Divisa
converted by Web2PDFConvert.com
TipoTransaccion Divisa Cantidad
---------------------- -------------------- -----------
Salida Dolar 1000
Salida Dolar 2000
Salida Dolar 4000
sum
===========
7000
TipoTransaccion Divisa Cantidad
---------------------- -------------------- -----------
Salida Libra 500
Salida Libra 300
Salida Libra 900
sum
===========
1700
TipoTransaccion Divisa Cantidad
---------------------- -------------------- -----------
Salida Yen 30000
sum
===========
30000
(34 filas afectadas)
Comentarios
converted by Web2PDFConvert.com
Datos legales | Politica de privacidad | Contacte con nosotros | Publicidad
converted by Web2PDFConvert.com