首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将列基表转换为行基表

如何将列基表转换为行基表
EN

Stack Overflow用户
提问于 2020-11-23 14:48:30
回答 1查看 86关注 0票数 1

我需要一只手如何从下面的源表构造一个结果表。

来源表:

代码语言:javascript
复制
+-----+-------+--------+-----------+ 
| Cat | Data_1| Data_2 | Group_Idx |
+-----+-------+--------+-----------+
| 1-1 |  A11  |  B11   |     1     |
| 1-2 |  A12  |  B12   |     1     |
| 1-3 |  A13  |  B13   |     1     |
| 2-1 |  A21  |  B21   |     2     |
| 2-2 |  A22  |  B22   |     2     |
| 2-3 |  A23  |  B23   |     2     |
| 3-1 |  A31  |  B31   |     3     |
| 3-2 |  A32  |  B32   |     3     |
| 3-3 |  A33  |  B33   |     3     |
+-----+-------+--------+-----------+

成果表:

代码语言:javascript
复制
+-----+-------+-------+-------+-------+-------+-------+
| Idx | C_1_A | C_1_B | C_2_A | C_2_B | C_3_A | C_3_B |
+-----+-------+-------+-------+-------+-------+-------+
|  1  |  A11  |  B11  |  A21  |  B21  |  A31  |  B31  |
|  2  |  A12  |  B12  |  A22  |  B22  |  A32  |  B32  |          
|  3  |  A13  |  B13  |  A23  |  B23  |  A33  |  B33  |
+-----+-------+-------+-------+-------+-------+-------+

在源表列Cat中,例如1-1的数据将显示在结果表列的C_1_A、C_1_B和Idx 1下面。

例如,Cat 3-3的数据将显示在结果表的列C_3_A和C_3_B下面。

我的方法:

  1. 因为我提前从Group_Idx的源表知道了,例如,3是Group_Idx的最大数目。因此,我在结果表中插入了3行空白数据,如下所示: +-----+-------+-------+-------+-------+-------+-------+ +-+-+-------+-------+-------+-------+-------+-------+
  2. 我使用SUBSTRING来针对源表的Cat列,例如1-3,SUBSTRING('1-3',1,1) =1,这是我要针对的结果列C_1_A。 问题:如何动态地或使用if条件切换要更新的列(结果表)。
  3. 然后,我尝试使用另一个SUBSTRING来针对结果表的哪一行进行更新: SUBSTRING('1-3', 3 ,1) =3。这应该是SQL子句的最后一部分。 创建表源(Cat VARCHAR(5),Data_1 VARCHAR(5),Data_2 VARCHAR(5),Group_Idx VARCHAR(5));插入源(Cat,Data_1,Data_2,Group_Idx)值('1-1‘,'A11','B11','1');插入源(Cat,Data_1,Data_2,Group_Idx)值('1-2’,'A12','B12','1');插入源(Cat,Data_1,Data_2,Group_Idx)值('1-3‘,'A13','B13','1');插入源(Cat,Data_1,Data_2,Group_Idx)值('2-1’,'A21','B21','2');插入源(Cat,Data_1,Data_2,Group_Idx)值('2-2‘,'A22','B22','2');插入源(Cat,Data_1,Data_2,Group_Idx)值('2-3‘,'A23','B23','2');插入源(Cat,Data_1,Data_2,Group_Idx)值('3-1’,'A31','B31','3');插入源(Cat,Data_1,Data_2,Group_Idx)值('3-2‘,'A32','B32','3');插入源(Cat,Data_1,Data_2,Group_Idx)值('3-3‘,'A33','B33','3');创建表结果(Idx(5),C_1_A VARCHAR(5),C_1_B VARCHAR(5),C_2_A VARCHAR(5),C_2_B VARCHAR(5),C_3_A VARCHAR(5),C_3_B VARCHAR(5));插入结果(Idx)值('1');插入结果(Idx)值('2');插入结果(Idx)值('3');
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-23 14:51:55

您可以使用条件聚合。我不知道您是希望cat的第三个字符定义结果中的列,还是只对类别进行排序。这采用了后一种方法:

代码语言:javascript
复制
select group_idx,
       max(case when seqnum = 1 then data_1 end) as c_1_a,
       max(case when seqnum = 1 then data_2 end) as c_1_b,
       max(case when seqnum = 2 then data_1 end) as c_2_a,
       max(case when seqnum = 2 then data_2 end) as c_2_b,
       max(case when seqnum = 3 then data_1 end) as c_3_a,
       max(case when seqnum = 3 then data_2 end) as c_3_b
from (select s.*,
             row_number() over (partition by group_idx order by cat) as seqnum
      from source s
     ) s
group by group_idx;

这里是db<>fiddle。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64970689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档