@SQSummit13
@enriquecatala
@
Lenguaje TSQL como aproximación a
escenarios BI
300
REL30012
Enrique Catala Bañuls
MCT – Microsoft Active Professional – Technical Ranger
EN CUMPLIMIENTO CON LA LEY 15/1999 DE PROTECCION DE DATOS DE
CARÁCTER PERSONAL, PONEMOS EN TU CONOCIMIENTO QUE
ESTA SESIÓN VA A SER GRABADA
POR SOLIDQ Y QUE ESTA GRABACIÓN PODRÍA SER UTILIZADA COMO MATERIAL
DE MARKETING Y HACERSE PUBLICA A TRAVÉS DE DIVERSOS MEDIOS, COMO
POR EJEMPLO NUESTRA PAGINA WEB.
TENIENDO EN CUENTA QUE TU IMAGEN PUEDE APARECER EN ESA GRABACIÓN,
SI NO DESEAS APARECER, ROGAMOS NOS LO COMUNIQUES POR LOS MEDIOS
QUE YA CONOCES.
COMUNICADO
2
Objetivos de la sesión
1. Agrupación de conjuntos
2. Funciones CUBE y ROLLUP
3. Pivotado de datos
4. Funciones analíticas en SQL Server 2012
3
DEMO
7
GROUPING SETS
Objetivos de la sesión
1. Agrupación de conjuntos
2. Funciones CUBE y ROLLUP
3. Pivotado de datos
4. Funciones analíticas en SQL Server 2012
8
DEMO
11
CUBE y ROLLUP
Objetivos de la sesión
1. Agrupación de conjuntos
2. Funciones CUBE y ROLLUP
3. Pivotado de datos
4. Funciones analíticas en SQL Server 2012
12
Pivotado de datosPIVOT
13
Rotar datos desde filas a columnas
Permite agregar múltiples valores a un único valor
k1 k2 c1
1 A v1
1 B v2
1 C v3
2 A v4
2 B v5
2 C v6
k1 A B C
1 v1 v2 v3
2 v4 v5 v6
PIVOT
Pivotado de datosCaso práctico para Open Schema
14
Cada atributo almacenado en una fila aparte
PIVOT perfecto para representar datos y
manipular este escenario
-- OpenSchema
objectid attribute val
----------- --------- -----------
1 attr1 ABC
1 attr2 10
1 attr3 2008-01-01
2 attr2 12.300
2 attr3 X
2 attr4 Y
2 attr5 14.700
3 attr1 XYZ
3 attr2 20
3 attr3 2009-01-01
-- Desired Result:
objectid attr1 attr2 attr3 attr4 attr5
----------- ----- ------ ---------- ----- ------
1 ABC 10 2008-01-01 NULL NULL
2 NULL 12.300 X Y 13.700
3 XYZ 20 2009-01-01 NULL NULL
PIVOT
Pivotar con GROUP BY
15
-- OpenSchema
objectid attribute val
----------- --------- -----------
1 attr1 ABC
1 attr2 10
1 attr3 2008-01-01
2 attr2 12.300
2 attr3 X
2 attr4 Y
2 attr5 14.700
3 attr1 XYZ
3 attr2 20
3 attr3 2009-01-01
-- Desired Result:
objectid attr1 attr2 attr3 attr4 attr5
----------- ----- ------ ---------- ----- ------
1 ABC 10 2008-01-01 NULL NULL
2 NULL 12.300 X Y 13.700
3 XYZ 20 2009-01-01 NULL NULL
PIVOT
SELECT objectid,MAX(CASE WHEN attribute = 'attr1' THEN val END) AS attr1,MAX(CASE WHEN attribute = 'attr2' THEN val END) AS attr2,MAX(CASE WHEN attribute = 'attr3' THEN val END) AS attr3,MAX(CASE WHEN attribute = 'attr4' THEN val END) AS attr4,MAX(CASE WHEN attribute = 'attr5' THEN val END) AS attr5
FROM dbo.OpenSchemaGROUP BY objectid;
Agrupación
(implícita)
Agregación
Distribución
Pivotar con operador PIVOT
16
-- OpenSchema
objectid attribute val
----------- --------- -----------
1 attr1 ABC
1 attr2 10
1 attr3 2008-01-01
2 attr2 12.300
2 attr3 X
2 attr4 Y
2 attr5 14.700
3 attr1 XYZ
3 attr2 20
3 attr3 2009-01-01
-- Desired Result:
objectid attr1 attr2 attr3 attr4 attr5
----------- ----- ------ ---------- ----- ------
1 ABC 10 2008-01-01 NULL NULL
2 NULL 12.300 X Y 13.700
3 XYZ 20 2009-01-01 NULL NULL
PIVOT
SELECT objectid, attr1, attr2, attr3, attr4, attr5FROM dbo.OpenSchemaPIVOT(MAX(val)
FOR attributeIN([attr1],[attr2],[attr3],[attr4],[attr5])
) AS P;
Agrupación
(implícita)Agregación
Distribución
Despivotado de datosUNPIVOT
17
Rotar datos de columnas a filas
k1 A B C
1 v1 v2 v3
2 v4 v5 v6
k1 k2 c1
1 A v1
1 B v2
1 C v3
2 A v4
2 B v5
2 C v6
UNPIVOT
DEMO
19
PIVOT y UNPIVOT
Objetivos de la sesión
1. Agrupación de conjuntos
2. Funciones CUBE y ROLLUP
3. Pivotado de datos
4. Funciones analíticas en SQL Server 2012
20
Window functions¿Por qué las necesitamos?
21
¿Qué pasa si queremos obtener la suma y
el valor de la columna? (group y detalle)
select id_table, value,
sum(value) as [sum(value)]
from table1
Msg 8120, Level 16, State 1, Line 1
Column 'table1.id_table' is invalid in the select list because it is not
contained in either an aggregate function or the GROUP BY clause.
id_table value
1 1
2 1
2 2
3 1
3 2
3 3
SUM(value)
1
3
6
id_table value sum(value)
1 1 1
2 1 3
2 2 3
3 1 6
3 2 6
3 3 6
Select sum(value) as [sum(value)]
from table1
En un motor relacional es correcta estaaproximación?
Window functions¿Por qué necesitamos window functions?
22
La solución pasa por usar la cláusula OVER
select id_table,
value,
sum(value) over(partition by id_table)
from table1
id_table value sum(value)
1 1 1
2 1 3
2 2 3
3 1 6
3 2 6
3 3 6
Window functionsEvolución
23
Cláusula OVER
Window functionsDesglose
24
Partitioning
Ordering
Slicing/framing
Window functionsConceptos clave
25
Partition
UNBOUNDED
FOLLOWING
UNBOUNDED
PRECEDING
CURRENT
ROW
Window functionsConceptos clave: Particion
26
Grupo de filas con
“características”
similares dentro de
un conjunto
actid tranid
1 1
2 1
2 2
3 1
3 2
3 3
Window functionsConceptos clave: Slicing/Framing
27
RANGE/ROWS
– ROWS | RANGE BETWEEN <B1> AND <B2>
– ROWS | RANGE <B1>
Window functionsConceptos clave: Slicing/Framing
28
B1 and B2 can be– UNBOUNDED PRECEDING
– UNBOUNDED FOLLOWING
– CURRENT ROW
– FOR ROWS ONLY• <scalar expression> PRECEDING
• <sclara expression> FOLLOWING
Note– B1 <= B2 or NULL will be returned
• Except in COUNT() that 0 will be returned
Window functionsConceptos clave
29
Partition
UNBOUNDED
FOLLOWING
UNBOUNDED
PRECEDING
CURRENT
ROW
DEMO
30
Funciones analíticas
ConclusionesObjetivos de la sesión
31
• Agrupación de conjuntos múltiple
• Conceptos CUBE y ROLLUP
• Pivotado de datos
• Funciones analíticas decentes en SQL
Server 2012
¿Preguntas?
32
¡Gracias!
Siéntate a comer con nosotros o tómate un café y aclara tus
dudas
33
@enriquecatala
Mentor
Enrique Catalá
Si quieres disfrutar de las mejores sesiones de
nuestros mentores de España y Latino América,
ésta es tu oportunidad.
http://summit.solidq.com/madrid/
Síguenos:
34