mysql單錶行轉列 mysql資料行轉列

2021-10-18 22:05:12 字數 2407 閱讀 7237

在你找工作的經歷當中,是否有面試官問過你:資料庫行轉列如何實現?

乙個典型的例子如下:

有這樣乙個訂單表(om_order)一條記錄包含訂單號、建立日期、訂單總金額;

讓你統計不同年份對應各月份的銷售情況,要求每一年的銷售情況一行展示,效果如下:

| 年份   | 一月        | 二月   | 三月     | 四月     | 五月     | 六月     | 七月     | 八月     | 九月     | 十月     | 十一月    | 十二月       |

|   2011 |        0.00 |   0.00 |     0.00 |     0.00 |     0.00 |     0.00 |     0.00 |     0.00 |     0.00 |     0.00 |      0.00 | 157791865.93 |

|   2012 | 59793317.04 |   0.00 | 79342.20 | 38757.74 | 45519.50 | 24669.33 | 49387.64 | 23206.87 | 10314.14 | 26005.00 |  60958.59 |      6386.90 |

// 表結構如下:

create table if not exists om_order(

order_no int primary key,

create_date datetime,

order_sum decimal(18,2)

好了,如何實現想要的效果呢?

要一步實現確實很有點困難,我們一步一步分析,先不考慮一行展示所有月份資料,我們先按照常規統計(列的形式)來展示每月銷售情況,sql如下:

select year(o.`create_date`) as '年份',month(o.`create_date`) as '月份',sum(`order_sum`) as '訂單銷售額' from `om_order` o

-- where year(o.`create_date`) = '2012'

group by year(o.`create_date`),month(o.`create_date`);

有了這樣的資料後結果後在處理就是單純的行轉列了,sql如下:

select tmp.o_year as '年份',

sum(case when tmp.o_month = 1 then tmp.o_total else 0 end) as '一月',

sum(case when tmp.o_month = 2 then tmp.o_total else 0 end) as '二月',

sum(case when tmp.o_month = 3 then tmp.o_total else 0 end) as '三月',

sum(case when tmp.o_month = 4 then tmp.o_total else 0 end) as '四月',

sum(case when tmp.o_month = 5 then tmp.o_total else 0 end) as '五月',

sum(case when tmp.o_month = 6 then tmp.o_total else 0 end) as '六月',

sum(case when tmp.o_month = 7 then tmp.o_total else 0 end) as '七月',

sum(case when tmp.o_month = 8 then tmp.o_total else 0 end) as '八月',

sum(case when tmp.o_month = 9 then tmp.o_total else 0 end) as '九月',

sum(case when tmp.o_month = 10 then tmp.o_total else 0 end) as '十月',

sum(case when tmp.o_month = 11 then tmp.o_total else 0 end) as '十一月',

sum(case when tmp.o_month = 12 then tmp.o_total else 0 end) as '十二月'/*,

sum(tmp.o_total) as '總計'*/

from

select year(o.`create_date`) as o_year,month(o.`create_date`) as o_month,sum(`order_sum`) as o_total from `om_order` o

group by year(o.`create_date`),month(o.`create_date`)

) tmp

group by tmp.o_year;

好了,大功告成!

分享到:

2013-01-01 15:06

瀏覽 1959

分類:資料庫

mysql行轉列怎麼用 mysql錶行轉列的用法

現在有一張score表,儲存學生每門課的成績,結構資料如下 idnamesubjectscore 1張三 語文90 2張三 數學88 3張三 外語75 4李四 語文99 5李四 數學70 6李四 外語95 7李五 語文88 8李五 數學85 9李五 外語90 現在要求列出每個學生所有課程的成績.這就...

mysql 動態行轉列 MySQL行轉列

比如乙個單子,多個收據單用逗號隔開,怎麼把這乙個單子所有收據單獨展示出來,行轉成列呢?方法一 這裡需要用到迴圈,首先建立乙個1 10的序列 select rownum rownum 1 as seq from select rownum 0 r,bills limit 0,10 其次依次運用 sub...

mysql行轉列 subs mysql 行轉列

存在表score,記錄學生的考試成績,如下圖所示 現要求以 學生姓名,語文,數學,英語 這種格式顯示學生成績,如下圖所示 具體步驟如下 1 首先,使用case when函式輸出單個課程的成績 case when course 語文 then score end as 語文 case when cou...