多行資料合併成一行
阿新 • • 發佈:2018-11-08
需求:在大資料平臺maxcompute上統計各個等級對應的人數,欄位大致如下
CREATE TABLE `XXXX` ( `requestid` char(32) DEFAULT NULL, `id` char(32) NOT NULL, `createtime` varchar(50) DEFAULT NULL COMMENT '建立時間', `createdate` varchar(50) DEFAULT NULL COMMENT '建立日期', `showdate` varchar(50) NOT NULL DEFAULT '' COMMENT '統計日期', `total` int(11) DEFAULT '0' COMMENT '總人數', `five_star_num` int(11) DEFAULT '0' COMMENT '五星級人數', `four_star_num` int(11) DEFAULT '0' COMMENT '四星級人數', `three_star_num` int(11) DEFAULT '0' COMMENT '三星級人數', `two_star_num` int(11) DEFAULT '0' COMMENT '二星級人數', `one_star_num` int(11) DEFAULT '0' COMMENT '一星級人數', `zero_star_num` int(11) DEFAULT '0' COMMENT '零星級人數', `new_member` int(11) DEFAULT '0' COMMENT '新增使用者數', PRIMARY KEY (`showdate`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='日活-使用者等級變化統計表';
目前面臨的問題:各個等級都在一張表中,可以按等級分類查詢人數,查詢語句如下:
查詢出各個等級對應的人數
select user_level,count(id) as count from XXX where register_date<=? group by user_level
查詢結果如下
然而現在只能在大資料平臺(maxcompute)編寫sql,不能借助任何高階語句(如java),要實現將表內的資料以一行的形式儲存到
with a1 as ( select user_level,count(id) as count from XXXXXXX where register_date<=? group by user_level ),a4 as( select sum(CASE when a1.user_level="0" then a1.count else 0 end) as zero_star_num, sum(CASE when a1.user_level="1" then a1.count else 0 end) as one_star_num, sum(CASE when a1.user_level="2" then a1.count else 0 end) as two_star_num, sum(CASE when a1.user_level="3" then a1.count else 0 end) as three_star_num, sum(CASE when a1.user_level="4" then a1.count else 0 end) as four_star_num, sum(CASE when a1.user_level="5" then a1.count else 0 end) as five_star_num from a1 ) select * from a4
結果如下