1. 程式人生 > >多行資料合併成一行

多行資料合併成一行

需求:在大資料平臺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

結果如下