在系統開發中常常遇到進行資料的統計,並將資料行轉列的情景,例如表中的表示。但是在資料庫中呈現出來的資料往往是橫行的樣式。這就需要乙個轉換。轉換的方式有兩種方式。1.利用cross join去進行轉換。2.利用case when函式去轉換。
資料庫查詢出的結果:
張三170
李四90
王五180
需要資料行轉列後的結果:
張三李四
王五170
90180
需求:
demo中就是簡單的統計學生的總成績。將統計結果進行行轉列顯示。
需要的表和資料:
t_studentinfo表
create table `t_studentinfo` (
`studentid` varchar(16) character set gbk collate gbk_chinese_ci not null ,
`studentname` varchar(32) character set gbk collate gbk_chinese_ci null default null ,
primary key (`studentid`)
)engine=innodb
default character set=gbk collate=gbk_chinese_ci
row_format=compact
;
insert into `t_studentinfo` values ('1001', '張三');
insert into `t_studentinfo` values ('1002', '李四');
insert into `t_studentinfo` values ('1003', '王五');
t_resultinfo表
create table `t_resultinfo` (
`id` varchar(16) character set gbk collate gbk_chinese_ci null default null ,
`result` varchar(32) character set gbk collate gbk_chinese_ci null default null ,
`studentid` varchar(16) character set gbk collate gbk_chinese_ci null default null
)engine=innodb
default character set=gbk collate=gbk_chinese_ci
row_format=compact
;
insert into `t_resultinfo` values ('1', '90', '1001');
insert into `t_resultinfo` values ('2', '80', '1001');
insert into `t_resultinfo` values ('3', '40', '1002');
insert into `t_resultinfo` values ('4', '50', '1002');
insert into `t_resultinfo` values ('5', '90', '1003');
insert into `t_resultinfo` values ('6', '90', '1003');
1.利用cross join去進行轉換。
利用cross join也可以實現,但是明顯的要效率低一點,當增加需要統計的使用者的時候需要再次增加查詢語句。
select * from (
select sum(result) as '張三'
from t_studentinfo t join t_resultinfo r on t.studentid=r.studentid and t.studentname='張三'
) a cross join
(select sum(result) as '李四'
from t_studentinfo t join t_resultinfo r on t.studentid=r.studentid and t.studentname='李四'
) b cross join
(select sum(result) as '王五'
from t_studentinfo t join t_resultinfo r on t.studentid=r.studentid and t.studentname='王五'
) c
2.利用case when函式去轉換。
利用case when這種方式效率更高,sql也更便於理解。
select
sum(case when a.studentname='張三' then b.result end) as '張三',
sum(case when studentname='李四' then result end) as '李四',
sum(case when studentname='王五' then result end) as '王五'
from t_studentinfo a join t_resultinfo b on a.studentid=b.studentid;
總之,這兩種方式都可以實現行轉列,但是在真正的實戰專案中可以需求的情況更複雜,這就需要知識的基礎加上清晰的思路,其實往往資料統計都是這樣的,每個知識點單獨單拿出來,都會使用,但是怎麼樣把這些基礎的東西運用到一起得到使用者想要的資料,這才是我們需要考慮的問題,我覺得最主要的還是思路,找到簡單的方法。
SQL行轉列例項
sql行轉列是比較經典的問題 比如有如下資料表,有如下某一款號 表1 顏色 尺碼 庫存 紅色 s 10 紅色 m 80 白色 l 50 白色 s 60 要將上面的表轉化為如下格式 表2 顏色 s m l 紅色 10 80 0 白色 60 0 50 動態sql create table tbl 0 c...
行轉列技巧例項
insert into goods temp select a.goods id,a.bn as 商品編碼,a.name as 商品名稱,a.common name as 通用名,i.manufacturer as 生產廠家,a.cfproperty 處方分類,a.valid period as 有...
mysql行轉列的例項
準備表和資料 case when 實現行轉列 儲存過程實現行轉列 create procedure line to col begin declare i int declare chinese int declare math int declare english int declare nam...