MySql 行轉列的問題

2021-06-06 09:36:52 字數 3604 閱讀 3623

昨天遇到了乙個mysql資料庫的查詢問題,工作這麼長時間很久沒動資料庫了,幾乎忘記完了。真失敗!

不過後來經過同事一指點,出來了。欣喜萬分啊,這裡寫出來。

表1: cms_b_payment,其中 payment_method_id 是外來鍵。

表2: cms_s_payment_method ,主鍵id是cms_b_payment的外來鍵。

問題:  傳入乙個引數為分組型別:groupby varchar(20),引數可以為:year ,month ,week ,day

根據傳入的引數型別分組,比如說,按照天分組: 查出每天 付款方式為 cash ,medical card, health care voucher,visa card,master card 的各項總收入,其他的付款方式以 others 代替。

結果為:

查詢語句為:

select cr_dttm as create_date,

sum(case when name_en ='cash' then amount else 0 end) as cash,

sum(case when name_en = 'medical card' then amount else 0 end) as 'medical card',

sum(case when name_en = 'health care voucher' then amount else 0 end) as 'health care voucher',

sum(case when name_en = 'visa card' then amount else 0 end) as 'visa card',

sum(case when name_en = 'master card' then amount else 0 end) as 'master card',

sum(case when name_en !='cash' and name_en !='medical card' and name_en != 'health care voucher' and name_en != 'visa card' and name_en != 'master card' then amount else 0 end)as others

from

(select

case "day"

when "day" then date_format(p.cr_dttm,"%y-%m-%d")

when "week" then week(date_format(p.cr_dttm,'%y-%m-%d'))

when "month" then month(date_format(p.cr_dttm,"%y-%m-%d"))

end as cr_dttm,

pm.name_en name_en,sum(p.amount) amount

from cms_b_payment p,cms_s_payment_method pm

where pm.id= p.payment_method_id

group by date_format(p.cr_dttm,"%y-%m-%d"),p.payment_method_id)as table1

group by create_date;

分析:

1.  

sum(case when  name_en ='cash' then amount else 0 end) as cash  是將得到的結果進行行轉列求和的方式。
2.

case  "day"

when "day" then date_format(p.cr_dttm,"%y-%m-%d")

when "week" then week(date_format(p.cr_dttm,'%y-%m-%d'))

when "month" then month(date_format(p.cr_dttm,"%y-%m-%d"))

end as cr_dttm,

case  "day"是傳入的引數。 分別判斷傳入的引數,並格式化。

若引數為 day, 則 cr_dttm 顯示的格式為2012-05-01

若引數為 week, 則 cr_dttm 顯示的格式為 int 型別的第幾周

若引數為 month, 則 cr_dttm 顯示的格式為2012-05

若引數為 year, 則 cr_dttm 顯示的格式為2012

mysql按周,按月,按日分組統計資料

select date_format(create_time,'%y%u') weeks,count(caseid) count from tc_case group by weeks;  

select date_format(create_time,'%y%m%d') days,count(caseid) count from tc_case group by days;

select date_format(create_time,'%y%m') months,count(caseid) count from tc_case group by months;

date_format(date,format)

根據format字串格式化date值。下列修飾符可以被用在format字串中:

%m 月名字(january……december)

%w 星期名字(sunday……saturday)

%d 有英語字首的月份的日期(1st, 2nd, 3rd, 等等。)

%y 年, 數字, 4 位

%y 年, 數字, 2 位

%a 縮寫的星期名字(sun……sat)

%d 月份中的天數, 數字(00……31)

%e 月份中的天數, 數字(0……31)

%m 月, 數字(01……12)

%c 月, 數字(1……12)

%b 縮寫的月份名字(jan……dec)

%j 一年中的天數(001……366)

%h 小時(00……23)

%k 小時(0……23)

%h 小時(01……12)

%i 小時(01……12)

%l 小時(1……12)

%i 分鐘, 數字(00……59)

%r 時間,12 小時(hh:mm:ss [ap]m)

%t 時間,24 小時(hh:mm:ss)

%s 秒(00……59)

%s 秒(00……59)

%p am或pm

%w 乙個星期中的天數(0=sunday ……6=saturday )

%u 星期(0……52), 這裡星期天是星期的第一天

%u 星期(0……52), 這裡星期一是星期的第一天

%% 乙個文字「%」。

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...

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

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