資料行轉列執行個體,資料列執行個體

來源:互聯網
上載者:User

資料行轉列執行個體,資料列執行個體

    在系統開發中常常遇到進行資料的統計,並將資料行轉列的情景,例如表中的表示。但是在資料庫中呈現出來的資料往往是橫行的樣式。這就需要一個轉換。轉換的方式有兩種方式。1.利用cross join去進行轉換。2.利用case when函數去轉換。

資料庫查詢出的結果:

張三 170
李四 90
王五 180

需要資料行轉列後的結果:
張三 李四 王五
170 90 180

需求:

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;

    總之,這兩種方式都可以實現行轉列,但是在真正的實戰項目中可以需求的情況更複雜,這就需要知識的基礎加上清晰的思路,其實往往資料統計都是這樣的,每個知識點單獨單拿出來,都會使用,但是怎麼樣把這些基礎的東西運用到一起得到使用者想要的資料,這才是我們需要考慮的問題,我覺得最主要的還是思路,找到簡單的方法。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.