Professional Documents
Culture Documents
Pivot Tables Mysql 5
Pivot Tables Mysql 5
Pivot Tables Mysql 5
PivotTablesin
MySQL5
About me
http://datacharmer.org
Agenda
Common solutions
Statistical reports
Spreadsheets tools
DBIx::SQLCrosstab (2004)
Row
headers
Row
headers
Distinct
values
9
Column
++
headers
|deptbygender|
+++++
|dept|m|f|total|
+++++
|dev|1|1|2|
|pers|3|1|4|
|sales|2|1|3|
+++++
Row
headers
Distinct
values
10
11
Common solutions
12
13
14
15
Dedicated tools
PRO
Easy to use
Rich in features
Well integrated to BI
packages
17
Dedicated tools
CON
18
PRO
24
CON
25
GROUP_CONCAT
26
GROUP_CONCAT (1)
SELECTGROUP_CONCAT(DISTINCTgender)
AScolumn_listFROMperson;
++
|column_list|
++
|m,f|
++
27
GROUP_CONCAT (2)
SELECTGROUP_CONCAT(DISTINCT
CONCAT('\nCOUNT(CASEWHENgender="',
gender,'"THENidELSENULLEND)AS
',gender))AScolumn_list
FROMperson\G
column_list:
COUNT(CASEWHENgender="m"THENid
ELSENULLEND)ASm,
COUNT(CASEWHENgender="f"THENid
ELSENULLEND)ASf
28
GROUP_CONCAT (3)
PRO
Easy to use
Dynamic
Fast (built-in)
29
GROUP_CONCAT (4)
CON
30
Cursor (1)
#outlineonly
DECLAREdpchar(10);
DECLAREcolumn_listTEXTdefault'';
DECLARECURSORget_colsFOR
SELECTDISTINCTdeptFROMperson;
OPENget_cols;
LOOP
FETCHget_colsINTOdp;
SETcolumn_list=CONCAT(column_list,
',',dp);
ENDLOOP;
31
Cursor (2)
PRO
No memory limits
Fast
32
Cursor (3)
CON
Not dynamic
Verbose
33
No memory limits
dynamic
35
36
37
PRO
No memory limits
no temporary tables
38
CON
Not dynamic
Dedicated routines need to
be created by external
language
39
It IS NOT STANDARD
40
Very UNOFFICIALLY
41
PRO
Dynamic
No memory limits
No temporary tables
Efficient
42
CON
43
DISCLAIMER
HACK!
44
HOW
(http://datacharmer.org)
mysqlt<crosstab_install.mysql
then use it
mysql>CALLcrosstab_help()
45
46
PROCEDUREget_crosstab_simple(
row_namevarchar(50),
thefieldthatidentifieseachrow
col_namevarchar(50),
fromwhichcolumnwespreadthevalues
opvarchar(10),
whichoperation(COUNT,SUM,AVG)
op_colvarchar(50),
towhichcolumnweoperate
from_clausevarchar(1000)
thedataorigin
)
47
set@XTAB_FORMAT="show";
callget_crosstab_simple(
"department",row_name
"gender",col_name
"COUNT",op
"person_id",op_col
"personinnerjoindepartmentsusing
(dept_id)"from_clause
);
48
+++++
|department|m|f|total|
+++++
|dev|1|1|2|
|pers|3|1|4|
|sales|2|1|3|
+++++
49
set@XTAB_FORMAT="show";
set@WITH_ROLLUP=1;
callget_crosstab_simple(
"gender",row_name
"department",col_name
"COUNT",op
"person_id",op_col
"personinnerjoindepartmentsusing
(dept_id)"from_clause
);
50
++++++
|gender|pers|sales|dev|total|
++++++
|f|1|1|1|3|
|m|3|2|1|6|
|NULL|4|3|2|9|
++++++
51
52
53
54
(http://datacharmer.org)
mysql<oo_crosstab_install.mysql
then use it
mysql>CALLoo_crosstab_help()
55
==ObjectOrientedCROSSTABUSAGE==
PROCEDURExtab_new(crosstab_namevarchar(50));
PROCEDURExtab_set(crosstab_name,p_param_name,
p_param_value)
PROCEDURExtab_check(crosstab_name)
PROCEDURExtab_show(crosstab_name)
PROCEDURExtab_exec(crosstab_name)
PROCEDURExtab_drop(crosstab_name)
56
+++
|checkresult|errormessage|
+++
|0|dept_by_gender:parameter<from_clause>notset|
+++
57
59
60
61
#Exportingcrosstabs
SELECTxtab_export('gender_by_dept',
'detailed')\G
******************1.row********************
xtab_export('gender_by_dept','detailed'):
CALLxtab_new('gender_by_dept');
CALLxtab_set('gender_by_dept','row_name','gender');
CALLxtab_set('gender_by_dept','col_name','department');
CALLxtab_set('gender_by_dept','id_name',NULL);
CALLxtab_set('gender_by_dept','col_from',NULL);
CALLxtab_set('gender_by_dept','op','sum');
CALLxtab_set('gender_by_dept','op_col','salary');
CALLxtab_set('gender_by_dept','from_clause','person
innerjoindepartmentsusing(dept_id)');
CALLxtab_set('gender_by_dept','where_clause',NULL);
CALLxtab_set('gender_by_dept','wanted_result',NULL);
63
#Exportingcrosstabquery
CALLxtab_query('gender_by_dept')\G
******************1.row********************
queryforcrosstab:
SELECTgender
,sum(CASEWHENdepartment='pers'THENsalary
ELSENULLEND)AS`pers`
,sum(CASEWHENdepartment='sales'THENsalary
ELSENULLEND)AS`sales`
,sum(CASEWHENdepartment='dev'THENsalary
ELSENULLEND)AS`dev`
,sum(salary)astotal
FROMpersoninnerjoindepartmentsusing(dept_id)
GROUPBYgender
64
Parting thoughts
THANKS
Question
time
http://datacharmer.org