開發中難免遇到一些非常靈活的設計,比如對sql的行轉列進行業務資料展現的.
最近在做系統設計的時候設計了乙個公共物件的擴充套件表,然後需要實現不同業務物件的組合查詢,因此借鑑了以前經典的學生科目成績行轉列的案例
在此自己做了修正,以供分享.
先曬圖說效果
1、表的原始資料
2、轉換後的資料
ok ,下面具體介紹如何實現
環境:mysql 5.5
工具: sqlyogent
首先是建立的學生科目成績表
create table `tb_subject` (
`name` varchar(30) default null,
`subject` varchar(30) default null,
`result` varchar(30) default null,
`id` int(11) not null auto_increment,
`***` int(11) default null,
primary key (`id`)
) engine=innodb auto_increment=9 default charset=utf8;
然後插入一點資料
insert into `tb_subject`(`name`,`subject`,`result`,`id`,`***`) values ('張三','語文','85',1,null),('張三','數學','95',2,null),('張三','物理','90',3,null),('李四','語文','65',4,null),('李四','數學','100',5,null),('李四','物理','87',6,null),('李四','作文','優',7,null),('張三','作文','差',8,null);
之後的效果如下:
行轉列的幾種方式:
之類我採用了兩種方式,直接sql語句,另一種是通過儲存過程
第一種,採用純的sql語句,不過這種相對比較呆板
select distinct a.name,
(select result from tb_subject b where a.name=b.name and b.subject='語文' ) as '語文',
(select result from tb_subject b where a.name=b.name and b.subject='數學' ) as '數學',
(select result from tb_subject b where a.name=b.name and b.subject='物理' ) as '物理',
(select result from tb_subject b where a.name=b.name and b.subject='作文' ) as '作文'
from tb_subject a
第二種採用了建立儲存過程方式:
delimiter &&
create procedure row_column()
begin
#課程名稱
declare sub_name varchar(20);
#所有課程數量
declare count int;
#計數器
declare i int default 0;
#拼接sql字串
set @s = 'select a.name';
set count = (select count(distinct subject) from tb_subject);
while i < count do
set sub_name = (select distinct subject from tb_subject limit i,1);
# set @s = concat(@s, ', case subject when ','\'', sub_name,'\'',' then result end',' as ','\'',sub_name,'\'');
set @s = concat(@s, ',(select result from tb_subject b where a.name=b.name and b.subject=','\'', sub_name,'\'',') as \'',sub_name,'\'');
#用於除錯
# select @s;
set i = i+1;
end while;
set @s = concat(@s, ' from tb_subject a group by a.name');
#用於除錯
#select @s;
prepare st from @s;
execute st;
end&& call row_column();
以上兩種最終的執行效果一樣,如下:
ok,暫且整理到這裡吧,希望能幫到有需要的朋友.
sql查詢行轉列
昨天下午碰到乙個需求,乙個大約30萬行的表,其中有很多重複行,在這些行中某些字段值是不重複的。比如有id,name,contract id,sales,product等,除了product欄位,其餘欄位均是一樣的,需要去重並合併product欄位。下午頭腦發昏,直接寫了個o nm 的vba 從16 ...
mysql 查詢行轉列 SQL語句實現行轉列查詢
表sales 查詢結果如下 1 建表 create table dbo sales id int identity 1,1 not null,year int null,jidu int null,jine int null,primary key clustered id asc with pad...
SQL行轉列的實現
將列值旋轉成列名 即行轉列 是我們在開發中經常會遇到的乙個需要,下面就介紹三種實現思路。假設我有表tb score且表中資料如下圖 行轉列之後的效果如下圖 方式一 使用靜態sql select user name 姓名,sum case course when 語文 then score else ...