前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用SQL给经过两次转置的结果集添加列标题

用SQL给经过两次转置的结果集添加列标题

作者头像
用户1148526
发布2022-11-12 11:43:53
1.2K0
发布2022-11-12 11:43:53
举报
文章被收录于专栏:Hadoop数据仓库

问题:

        想合并两个结果集,并将它们转置为两列,另外还想给各组添加列“标题”。

表数据:

代码语言:javascript
复制
mysql> select * from t1;
+------+------------+
| a    | b          |
+------+------------+
|  100 | HOPKINS    |
|  100 | JONES      |
|  100 | TONEY      |
|  200 | MORALES    |
|  200 | P.WHITAKER |
|  200 | MARCIANO   |
|  200 | ROBINSON   |
|  300 | LACY       |
|  300 | WRIGHT     |
|  300 | J.TAYLOR   |
+------+------------+
10 rows in set (0.00 sec)

mysql> select * from t2;
+------+------------+
| a    | b          |
+------+------------+
|  400 | CORRALES   |
|  400 | MAYWEATHER |
|  400 | CASTILLO   |
|  400 | MARQUEZ    |
|  400 | MOSLEY     |
|  500 | GATTI      |
|  500 | CALZAGHE   |
|  600 | LAMOTTA    |
|  600 | HAGLER     |
|  600 | HEARNS     |
|  600 | FRAZIER    |
|  700 | GUINN      |
|  700 | JUDAH      |
|  700 | MARGARITO  |
+------+------------+
14 rows in set (0.00 sec)

要求结果集:

代码语言:javascript
复制
+-------------+-------------+
| research    | apps        |
+-------------+-------------+
| 100         | 400         |
|  HOPKINS    |  CORRALES   |
|  JONES      |  MAYWEATHER |
|  TONEY      |  CASTILLO   |
| 200         |  MARQUEZ    |
|  MORALES    |  MOSLEY     |
|  P.WHITAKER | 500         |
|  MARCIANO   |  GATTI      |
|  ROBINSON   |  CALZAGHE   |
| 300         | 600         |
|  LACY       |  LAMOTTA    |
|  WRIGHT     |  HAGLER     |
|  J.TAYLOR   |  HEARNS     |
|             |  FRAZIER    |
|             | 700         |
|             |  GUINN      |
|             |  JUDAH      |
|             |  MARGARITO  |
+-------------+-------------+

实现:

代码语言:javascript
复制
select max(case when flag2 = 0 then it_dept else '' end) research,   -- 行转列
       max(case when flag2 = 1 then it_dept else '' end) apps
  from (
select sum(flag1) over (partition by flag2 order by flag1,rn) flag,it_dept, flag2 -- 每个分区取行号
  from ( 
select flag1,flag2, it_dept, row_number() over(order by flag2, a,id desc,rn) rn  -- 排序显示
  from (
select 1 flag1, 0 flag2, case id when 2 then a else concat(' ',b)  end it_dept,a,id,rn   -- 标题行替换
  from (select x.*, y.id, row_number()over(partition by x.a order by y.id) rn   -- rn用于where条件
          from (select a, b, count(*)over(partition by a) cnt   -- 每个分区的行数
                  from t1) x,
               (select 1 id union select 2) y) t    -- 笛卡尔积制造2倍的行数
 where rn <= cnt+1   -- 每个分区多出一行

union all

select 1 flag1, 1 flag2, case id when 2 then a else concat(' ',b)  end it_dept,a,id,rn
  from (select x.*, y.id, row_number()over(partition by x.a order by y.id) rn
          from (select a, b, count(*)over(partition by a) cnt
                  from t2) x,
               (select 1 id union select 2) y) t 
 where rn <= cnt+1  
) t) t ) t 
-- 按行号分组max,合并行
group by flag;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题:
  • 实现:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档