資料行轉列執行個體,資料列執行個體
在系統開發中常常遇到進行資料的統計,並將資料行轉列的情景,例如表中的表示。但是在資料庫中呈現出來的資料往往是橫行的樣式。這就需要一個轉換。轉換的方式有兩種方式。1.利用cross join去進行轉換。2.利用case when函數去轉換。
資料庫查詢出的結果:
需要資料行轉列後的結果:
需求:
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=InnoDBDEFAULT CHARACTER SET=gbk COLLATE=gbk_chinese_ciROW_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=InnoDBDEFAULT CHARACTER SET=gbk COLLATE=gbk_chinese_ciROW_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;
總之,這兩種方式都可以實現行轉列,但是在真正的實戰項目中可以需求的情況更複雜,這就需要知識的基礎加上清晰的思路,其實往往資料統計都是這樣的,每個知識點單獨單拿出來,都會使用,但是怎麼樣把這些基礎的東西運用到一起得到使用者想要的資料,這才是我們需要考慮的問題,我覺得最主要的還是思路,找到簡單的方法。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。