日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

MySQL/MariaDB 如何實(shí)現(xiàn)數(shù)據(jù)透視表的示例代碼

瀏覽:5日期:2023-10-04 09:35:24

前文介紹了Oracle 中實(shí)現(xiàn)數(shù)據(jù)透視表的幾種方法,今天我們來看看在 MySQL/MariaDB 中如何實(shí)現(xiàn)相同的功能。

本文使用的示例數(shù)據(jù)可以點(diǎn)此下載。

使用 CASE 表達(dá)式和分組聚合

數(shù)據(jù)透視表的本質(zhì)就是按照行和列的不同組合進(jìn)行數(shù)據(jù)分組,然后對結(jié)果進(jìn)行匯總;因此,它和數(shù)據(jù)庫中的分組(GROUP BY)加聚合函數(shù)(COUNT、SUM、AVG 等)的功能非常類似。

我們首先使用以下 GROUP BY 子句對銷售數(shù)據(jù)進(jìn)行分類匯總:

select coalesce(product, ’【全部產(chǎn)品】’) '產(chǎn)品', coalesce(channel, ’【所有渠道】’) '渠道', any_value(coalesce(extract(year_month from saledate), ’【所有月份】’)) '月份', sum(amount) '銷量'from sales_datagroup by product,channel,extract(year_month from saledate) with rollup;

以上語句按照產(chǎn)品、渠道以及月份進(jìn)行匯總;with rollup 選項(xiàng)用于生成不同層次的小計(jì)、合計(jì)以及總計(jì);coalesce 函數(shù)用于將匯總行中的 NULL 值顯示為相應(yīng)的信息;any_value 函數(shù)用于返回分組內(nèi)的任意數(shù)據(jù),如果去掉會返回語法錯(cuò)誤(MySQL 的一個(gè) bug)。該查詢返回的結(jié)果如下:

產(chǎn)品 |渠道 |月份 |銷量 |---------|---------|-----------|-------|桔子 |京東 |201901 | 41289|桔子 |京東 |201902 | 43913|桔子 |京東 |201903 | 49803|桔子 |京東 |201904 | 49256|桔子 |京東 |201905 | 64889|桔子 |京東 |201906 | 62649|桔子 |京東 |【所有月份】| 311799|桔子 |店面 |201901 | 41306|桔子 |店面 |201902 | 37906|桔子 |店面 |201903 | 48866|桔子 |店面 |201904 | 48673|桔子 |店面 |201905 | 58998|桔子 |店面 |201906 | 58931|桔子 |店面 |【所有月份】| 294680|桔子 |淘寶 |201901 | 43488|桔子 |淘寶 |201902 | 37598|桔子 |淘寶 |201903 | 48621|桔子 |淘寶 |201904 | 49919|桔子 |淘寶 |201905 | 58530|桔子 |淘寶 |201906 | 64626|桔子 |淘寶 |【所有月份】| 302782|桔子 |【所有渠道】|【所有月份】| 909261|...香蕉 |【所有渠道】|【所有月份】| 925369|【全部產(chǎn)品】|【所有渠道】|【所有月份】|2771682|

實(shí)際上,我們已經(jīng)得到了銷量的匯總結(jié)果,只不過需要將數(shù)據(jù)按照不同月份顯示為不同的列;也就是需要將行轉(zhuǎn)換為列,這個(gè)功能可以使用 CASE 表達(dá)式實(shí)現(xiàn):

select coalesce(product, ’【全部產(chǎn)品】’) '產(chǎn)品', coalesce(channel, ’【所有渠道】’) '渠道', sum(case extract(year_month from saledate) when 201901 then amount else 0 end) '一月', sum(case extract(year_month from saledate) when 201902 then amount else 0 end) '二月', sum(case extract(year_month from saledate) when 201903 then amount else 0 end) '三月', sum(case extract(year_month from saledate) when 201904 then amount else 0 end) '四月', sum(case extract(year_month from saledate) when 201905 then amount else 0 end) '五月', sum(case extract(year_month from saledate) when 201906 then amount else 0 end) '六月', sum(amount) '總計(jì)'from sales_datagroup by product, channel with rollup;

第一個(gè) SUM 函數(shù)中的 CASE 表達(dá)式只匯總 201901 月份的銷量,其他月份銷量設(shè)置為 0;后面的 SUM 函數(shù)依次類推,得到了每個(gè)月的銷量匯總和所有月份的總計(jì)。該查詢返回的數(shù)據(jù)透視表如下:

產(chǎn)品 |渠道 |一月 |二月 |三月 |四月 |五月 |六月 |總計(jì) |----------|----------|------|------|------|------|------|------|-------|桔子 |京東 | 41289| 43913| 49803| 49256| 64889| 62649| 311799|桔子 |店面 | 41306| 37906| 48866| 48673| 58998| 58931| 294680|桔子 |淘寶 | 43488| 37598| 48621| 49919| 58530| 64626| 302782|桔子 |【所有渠道】|126083|119417|147290|147848|182417|186206| 909261|蘋果 |京東 | 38269| 40593| 56552| 56662| 64493| 62045| 318614|蘋果 |店面 | 43845| 40539| 44909| 55646| 56771| 64933| 306643|蘋果 |淘寶 | 42969| 43289| 48769| 58052| 58872| 59844| 311795|蘋果 |【所有渠道】|125083|124421|150230|170360|180136|186822| 937052|香蕉 |京東 | 36879| 36981| 51748| 54801| 64936| 60688| 306033|香蕉 |店面 | 41210| 39420| 50884| 52085| 60249| 67597| 311445|香蕉 |淘寶 | 42468| 41955| 52780| 54971| 56504| 59213| 307891|香蕉 |【所有渠道】|120557|118356|155412|161857|181689|187498| 925369|【全部產(chǎn)品】|【所有渠道】|371723|362194|452932|480065|544242|560526|2771682|

MySQL 中的 IF(expr1,expr2,expr3) 函數(shù)也可以用于替換上面 CASE 表達(dá)式。

有行轉(zhuǎn)列就有列轉(zhuǎn)行,MySQL 也沒有專門的函數(shù)處理這種情況,可以使用 UNION 操作符將多個(gè)結(jié)果集進(jìn)行合并。例如:

with d as ( select product, channel, sum(case extract(year_month from saledate) when 201901 then amount else 0 end) s01, sum(case extract(year_month from saledate) when 201902 then amount else 0 end) s02, sum(case extract(year_month from saledate) when 201903 then amount else 0 end) s03, sum(case extract(year_month from saledate) when 201904 then amount else 0 end) s04, sum(case extract(year_month from saledate) when 201905 then amount else 0 end) s05, sum(case extract(year_month from saledate) when 201906 then amount else 0 end) s06 from sales_data group by product, channel)select product, channel, 201901 saledate, s01 amount from dunion allselect product, channel, 201902 saledate, s02 from dunion allselect product, channel, 201903 saledate, s03 from dunion allselect product, channel, 201904 saledate, s04 from dunion allselect product, channel, 201905 saledate, s05 from dunion allselect product, channel, 201906 saledate, s06 from d;

通用表表達(dá)(with 子句)構(gòu)造了包含多個(gè)月份的銷量數(shù)據(jù),每個(gè)月份都是一列;然后每個(gè)查詢返回一個(gè)月份的數(shù)據(jù),并且通過 union all 操作符將所有結(jié)果合并到一起。

使用預(yù)編譯的動(dòng)態(tài) SQL 語句

使用 CASE 表達(dá)式和聚合函數(shù)實(shí)現(xiàn)數(shù)據(jù)透視表的方法存在一定的局限性,假如還有 7 月份到 12 月份的銷量需要統(tǒng)計(jì),我們就需要修改查詢語句增加這部分的處理。為此,我們可以使用動(dòng)態(tài) SQL 自動(dòng)生成行列轉(zhuǎn)換的語句:

select group_concat( distinct concat( ’ sum(case extract(year_month from saledate) when ’, dt, ’ then amount else 0 end) as '’, dt, ’'’) ) into @sqlfrom ( select extract(year_month from saledate) as dt from sales_data order by saledate) d;set @sql = concat(’select coalesce(product, ’’【全部產(chǎn)品】’’) '產(chǎn)品', coalesce(channel, ’’【所有渠道】’’) '渠道',’, @sql, ’, sum(amount) '總計(jì)' from sales_data group by product, channel with rollup;’);select @sql;prepare stmt from @sql;execute stmt;deallocate prepare stmt;

首先,通過查詢 sales_data 表找出所有的月份并且構(gòu)造 sum 函數(shù),將構(gòu)造的語句存入變量 @sql 中;group_concat 函數(shù)可以將多行字符串合并成單個(gè)字符串。

group_concat 函數(shù)允許返回的最大長度(字節(jié))由系統(tǒng)變量 group_concat_max_len 進(jìn)行設(shè)置,默認(rèn)值為 1024。

然后,使用 set 命令將查詢語句的其他部分和已有的內(nèi)容進(jìn)行合并,生成的查詢語句如下:

select coalesce(product, ’【全部產(chǎn)品】’) '產(chǎn)品', coalesce(channel, ’【所有渠道】’) '渠道', sum(case extract(year_month from saledate) when 201901 then amount else 0 end) as '201901', sum(case extract(year_month from saledate) when 201902 then amount else 0 end) as '201902', sum(case extract(year_month from saledate) when 201903 then amount else 0 end) as '201903', sum(case extract(year_month from saledate) when 201904 then amount else 0 end) as '201904', sum(case extract(year_month from saledate) when 201905 then amount else 0 end) as '201905', sum(case extract(year_month from saledate) when 201906 then amount else 0 end) as '201906', sum(amount) '總計(jì)'from sales_datagroup by product, channel with rollup;

最后通過預(yù)編譯命令執(zhí)行該語句并返回結(jié)果,即使增加了其他月份的銷售數(shù)據(jù)也不需要手動(dòng)修改查詢語句。

使用 CONNECT 存儲引擎

如果使用 MariaDB 10.0 以上的版本,可以利用 CONNECT 存儲引擎中的 PIVOT 表類型實(shí)現(xiàn)數(shù)據(jù)透視表。

首先,我們需要安裝 CONNECT 存儲引擎。Windows 系統(tǒng)可以執(zhí)行以下命令進(jìn)行動(dòng)態(tài)安裝:

INSTALL SONAME ’ha_connect’;

也可以在配置文件 my.ini 中增加以下內(nèi)容,不過需要重啟服務(wù):

[mysqld]plugin_load_add = ha_connect

對于 Linux 系統(tǒng),安裝過程可以參考官方文檔。

接下來我們定義一個(gè) pivot 類型的表:

create table pivot_sales( product varchar(20) not null, channel varchar(20) not null, `201901` decimal(10,2) not null flag=1, `201902` decimal(10,2) not null flag=1, `201903` decimal(10,2) not null flag=1, `201904` decimal(10,2) not null flag=1, `201905` decimal(10,2) not null flag=1, `201906` decimal(10,2) not null flag=1)engine=connect table_type=pivotoption_list=’PivotCol=saledate,FncCol=amount,host=127.0.0.1,user=root, password=p123456,port=3306’SrcDef=’select product,channel,date_format(saledate, ’’%Y%m’’) saledate,sum(amount) amount from sales_data group by product,channel,date_format(saledate, ’’%Y%m’’)’;

其中,engine 定義存儲引擎為 connect;table_type 定義表的類型為 pivot;option_list 用于定義各種選項(xiàng),PivotCol 表示要轉(zhuǎn)換成多個(gè)字段的數(shù)據(jù)所在的列,F(xiàn)ncCol 指定要進(jìn)行匯總的字段,其他是連接源表服務(wù)器的信息;SrcDef 用于指定源表查詢語句,也可以使用 Tabname 指定表名;上面的字段是透視表的結(jié)構(gòu),flag=1 表示聚合之后的字段。

創(chuàng)建成功之后,我們就可以直接查詢 pivot_sales 表中的數(shù)據(jù)了:

select * from pivot_sales;product |channel |201901 |201902 |201903 |201904 |201905 |201906 |--------|---------|--------|--------|--------|--------|--------|--------|桔子 |京東 |41289.00|43913.00|49803.00|49256.00|64889.00|62649.00|桔子 |店面 |41306.00|37906.00|48866.00|48673.00|58998.00|58931.00|桔子 |淘寶 |43488.00|37598.00|48621.00|49919.00|58530.00|64626.00|蘋果 |京東 |38269.00|40593.00|56552.00|56662.00|64493.00|62045.00|蘋果 |店面 |43845.00|40539.00|44909.00|55646.00|56771.00|64933.00|蘋果 |淘寶 |42969.00|43289.00|48769.00|58052.00|58872.00|59844.00|香蕉 |京東 |36879.00|36981.00|51748.00|54801.00|64936.00|60688.00|香蕉 |店面 |41210.00|39420.00|50884.00|52085.00|60249.00|67597.00|香蕉 |淘寶 |42468.00|41955.00|52780.00|54971.00|56504.00|59213.00|

目前,PIVOT 表支持的功能有限,只能進(jìn)行一些基本的操作。例如:

-- 不會出錯(cuò)select * from pivot_saleswhere channel =’京東’;-- 語法錯(cuò)誤select channel from pivot_saleswhere channel =’京東’;

到此這篇關(guān)于MySQL/MariaDB 如何實(shí)現(xiàn)數(shù)據(jù)透視表的示例代碼的文章就介紹到這了,更多相關(guān)MySQL/MariaDB數(shù)據(jù)透視表內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
91亚洲成人| 久久要要av| 综合五月婷婷| 偷拍亚洲精品| 日韩精品一区二区三区中文| 日本亚洲最大的色成网站www | 精品一区二区三区四区五区| 国产美女亚洲精品7777| 精品国产99| 999精品色在线播放| 免费在线观看日韩欧美| 国产精品一级| 色婷婷精品视频| 一区二区三区四区精品视频| 欧美激情麻豆| а√在线中文在线新版| 国产视频一区在线观看一区免费| 日韩精品a在线观看91| 麻豆一区二区三区| 黄色精品网站| 久久国产尿小便嘘嘘| 久久免费国产| 国产日韩欧美一区| 蜜桃tv一区二区三区| 国产欧美一区二区三区精品观看| 日韩在线欧美| 国产精品香蕉| 久久国产精品毛片| 国产91在线播放精品| 久久亚洲一区| 国产精品二区不卡| 欧美精品三级在线| 国产视频欧美| 性感美女一区二区在线观看| 亚洲欧洲美洲av| 久久蜜桃av| 免费国产自线拍一欧美视频| 亚洲最大av| 国产伦精品一区二区三区千人斩| 日韩精品1区2区3区| 日本不良网站在线观看| 国产精久久一区二区| 热久久免费视频| 欧美91精品| 久久久人人人| 成人台湾亚洲精品一区二区 | 久久亚洲成人| 精精国产xxxx视频在线播放 | 精品伊人久久久| 国产经典一区| 欧美一级网址| 日韩二区三区四区| 午夜久久免费观看| 91精品日本| 九色porny丨国产首页在线| 蜜臀久久99精品久久久久宅男| 欧美日韩调教| 久久免费影院| 悠悠资源网久久精品| 97久久亚洲| 欧美色图国产精品| 国产日韩高清一区二区三区在线| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 亚洲成人精品| 四虎成人精品一区二区免费网站 | 97精品国产福利一区二区三区| 91精品一区二区三区综合| 亚洲精品看片| 成人羞羞在线观看网站| 日本成人手机在线| 久久精品国产www456c0m| 久久狠狠亚洲综合| 国产精品美女| 在线人成日本视频| 青青草国产精品亚洲专区无| 狠狠操综合网| 牛牛精品成人免费视频| 尤物在线精品| av在线最新| 国产高清日韩| 日韩精品欧美大片| 99在线|亚洲一区二区| 久久久久黄色| 欧美日韩一区二区三区不卡视频| 性欧美xxxx免费岛国不卡电影| 麻豆精品视频在线| 国产三级一区| 欧美日韩视频免费看| 国产精品亲子伦av一区二区三区 | 香蕉久久夜色精品国产| 中文字幕一区二区精品区| 午夜精品成人av| 亚洲精品**中文毛片| 精品美女视频 | 欧美中文一区二区| 欧美二三四区| 日本少妇一区| 久久三级视频| 国产99久久| 久久精品1区| 精精国产xxxx视频在线播放| 卡一卡二国产精品| 国产精品网址| 久久精品国产999大香线蕉| 日韩精品高清不卡| 国产三级精品三级在线观看国产| 日本va欧美va精品发布| 日韩成人av影视| 国产精品综合色区在线观看| 免费日韩一区二区三区| 国产精品99久久精品| 欧美高清不卡| 日韩一区精品| 久久中文字幕一区二区三区| 97欧美在线视频| 欧美亚洲精品在线| 黄色日韩在线| 91精品国产自产在线丝袜啪| 九九九精品视频| 免费精品国产| 日本aⅴ精品一区二区三区| 精品美女视频 | 日韩一区二区三区在线看| 欧美日韩一区二区国产| 国产精品毛片久久| 亚洲成人三区| 日韩成人精品一区二区三区 | 嫩呦国产一区二区三区av| 国产成人久久精品一区二区三区| 日韩av免费| 日韩一区二区三免费高清在线观看| 开心激情综合| 视频一区欧美日韩| 精品国产欧美日韩一区二区三区| 国产乱子精品一区二区在线观看| 91精品国产乱码久久久久久久| 亚洲三区欧美一区国产二区| 国产videos久久| 亚洲免费观看高清完整版在线观| 91久久中文| 婷婷丁香综合| 视频一区二区国产| 国产欧美日韩亚洲一区二区三区| 精品国产一区二区三区av片| 国内精品麻豆美女在线播放视频| 日韩一区二区三区在线免费观看| 国产精品嫩草99av在线| 国产精品一区三区在线观看| 成人美女视频| 欧美视频一区| 日韩高清一区| 欧洲在线一区| 日本一区二区三区中文字幕| 精品日产乱码久久久久久仙踪林| 日韩在线观看一区| 亚洲欧美日本国产| 99久久精品国产亚洲精品| 日本精品国产| 久久久久久久久99精品大| 日韩精品欧美大片| 国产一区日韩一区| 国产欧美欧美| 欧美精品羞羞答答| 麻豆视频久久| 一区二区精彩视频| 色老板在线视频一区二区| 91成人在线| 亚洲综合欧美| 91精品一区国产高清在线gif| 欧美一区二区三区久久精品| 亚洲一级黄色| 国产精品福利在线观看播放| 日韩一区二区三区高清在线观看| 亚洲精品一级| 欧美在线日韩| 另类小说一区二区三区| 精品一区二区三区在线观看视频| 麻豆国产欧美日韩综合精品二区| 麻豆一区二区99久久久久| 久久97视频| 成人日韩在线观看| 亚洲激情欧美| 日韩在线网址| 免费看久久久| 久久婷婷久久| 99久久久国产精品美女| 亚洲少妇一区| 久久精品99国产国产精| 精品少妇av| 亚洲男女自偷自拍| 日韩成人精品一区二区三区| 精品国产美女a久久9999| 999久久久亚洲| 亚洲午夜免费| 国产精品成人一区二区不卡| 91久久中文| 国产高清日韩| av亚洲在线观看| 国产精品久久久久久妇女| 国产一区日韩欧美|