動態資料透視表pivot table 行轉換列

2021-06-21 16:03:16 字數 4275 閱讀 9177

mysql下如何動態生成標題的資料透視表。

先用以下script生成一張包含若干屬性的表叫"properties"。

create table properties (

id int(11) not null auto_increment,

item_id int(11) default null,

property_name varchar(255) default null,

value varchar(255) default null,

primary key (id)

);insert into properties values

(1, 1, 'color', 'blue'),

(2, 1, 'size', 'large'),

(3, 1, 'weight', 65),

(4, 2, 'color', 'orange'),

(5, 2, 'weight', 57),

(6, 2, 'size', 'large'),

(7, 3, 'size', 'small'),

(8, 3, 'color', 'red'),

(9, 3, 'weight', 12),

(10, 4, 'color', 'violet'),

(11, 4, 'size', 'medium'),

(12, 4, 'weight', 34),

(13, 5, 'color', 'green'),

(14, 5, 'weight', 10);

然後我們想根據原始資料生成如下report。

+----+---------+---------------+--------+

| id | item_id | property_name | value |

+----+---------+---------------+--------+

| 1 | 1 | color | blue |

| 2 | 1 | size | large |

| 3 | 1 | weight | 65 |

| 4 | 2 | color | orange |

| 5 | 2 | weight | 57 |

| 6 | 2 | size | large |

| 7 | 3 | size | small |

| 8 | 3 | color | red |

| 9 | 3 | weight | 12 |

| 10 | 4 | color | violet |

| 11 | 4 | size | medium |

| 12 | 4 | weight | 34 |

| 13 | 5 | color | green |

| 14 | 5 | weight | 10 |

+----+---------+---------------+--------+

=>

+---------+--------+--------+--------+

| item_id | color | size | weight |

+---------+--------+--------+--------+

| 1 | blue | large | 65 |

| 2 | orange | large | 57 |

| 3 | red | small | 12 |

| 4 | violet | medium | 34 |

| 5 | green | null | 10 |

+---------+--------+--------+--------+

眾所周知,mysql裡並沒有自動表轉換的功能。當然,我們可以用一些額外的程式或工具來連線mysql去執行資料轉換。但在這裡,我們來**下如何手動的寫乙個查詢來實現資料轉換。該查詢可以這樣實現:

select

item_id,

max(if(property_name = 'color', value, null)) as color,

max(if(property_name = 'size', value, null)) as size,

......

...from

properties

group by

item_id;

很明顯,對於任何乙個'property_name'我們都做了定義,如'color', 'size'。如果屬性的型別不變的話,這個查詢已經沒有問題了。但是如果字段'property_name'經常變,並且可能會增加乙個新的,那要怎麼處理呢?難道只能每次去改這個查詢語句麼?這種情況下,就可以使用動態生成查詢語句——讀取表中字段'property_name'的所有值,根據該值動態的建立乙個查詢語句。

動態生成查詢的實現如下:

set @sql = null;

select

group_concat(distinct

concat(

'max(if(property_name = ''',

property_name,

''', value, null)) as ',

property_name

)) into @sql

from properties;

set @sql = concat('select item_id, ', @sql, ' from properties group by item_id');

select

item_id,

max(if(property_name = 'color', value, null)) as color,

max(if(property_name = 'size', value, null)) as size,

max(if(property_name = 'weight', value, null)) as weight

from

properties

group by

item_id

注意:

mysql對於group_concat結果用系統變數group_concat_max_len做了限制,預設值是1024。所以,如果你的表有很多列,最好將該值設大一些。

set @@group_concat_max_len = 5000;

select group_concat(column_name) from table;

經過執行動態生成語句,查詢語句被寫到變數@sql裡,現在我們可以用prepared statment來執行該語句:

prepare stmt from @sql;

execute stmt;

deallocate prepare stmt;

結果:

+---------+--------+--------+--------+

| item_id | color | size | weight |

+---------+--------+--------+--------+

| 1 | blue | large | 65 |

| 2 | orange | large | 57 |

| 3 | red | small | 12 |

| 4 | violet | medium | 34 |

| 5 | green | null | 10 |

+---------+--------+--------+--------+

資料透視表

源明 資料透視表 的用法,他們總問俺 錦繡 又是那個怪怪的 資料透視表 源明 什麼怪怪的,上次不是給你說了,它的用途可大了,尤其是統計一些資料的時候,不用函式就能實現,有人從這些分析中能賺著大錢呢 錦繡 可是有點兒複雜,你知道唄,俺就奇怪你們學理科的人,寫出的東西又枯燥又難懂,俺就學不會,源明 所以...

資料透視表

寫在前面 最近給自己立下乙個任務 掌握excel中的資料透視表 vlookup,如果還有餘力可以再掌握其vba基礎。而因為已經具備程式設計基礎,所以我認為學習vba應該也不是什麼難事,前兩種的話,希望可以達到在簡歷上寫 熟練使用excel中的資料透視表 vlookup 而一點都不心虛,把能力扎扎實實...

資料透視表

恢復 ctrl y 全選 單擊左右翻頁箭頭按住shift鍵 一,透視表基本用法 選中製表單元格 插入資料透視表 拖動 月,部門,發生額 更改統計方法 單擊左上角計數項 求和,平均值,最大值 單擊右鍵 選擇值欄位數值 雙擊單元格看明細 二,更改時間單位 選中 插入 資料透視表 拖拽訂購日期 選中任意時...