如何将许多(和不同)单元从一行合并到更少单元的多行?

时间:2018-08-23 06:02:09

标签: sql sql-server

我不知道如何完成这样的转换,from(1行,两对相同类型的列重复3次):

NormalCol1 | NormalCol2 | col1_0 | col2_0 | col1_1 | col2_2 | col1_2 | col2_2
"AD"       | 2018-03-02 | "error"| "mess" | "warn" | "mess" | "info" | "mess"

to(3行和那6列合为2):

NormalCol1 | NormalCol2 | col1   | col2 
"AD"       | 2018-03-02 | "error"| "mess"
"AD"       | 2018-03-02 | "warn" | "mess"
"AD"       | 2018-03-02 | "info" | "mess"

您曾经偶然发现过这样的转变吗? 如果是,您是如何完成转换的?

Ps:列是固定的。

2 个答案:

答案 0 :(得分:3)

使用public class UserRoleSeed { private readonly RoleManager<IdentityRole> _roleManager; public UserRoleSeed(RoleManager<IdentityRole> roleManager) { _roleManager = roleManager; } public async void SeedAsync() { if ((await _roleManager.FindByNameAsync("Admin")) == null) { await _roleManager.CreateAsync(new IdentityRole { Name = "Admin" }); } } } 查询或UNION ALL(也使用CROSS APPLY)或union all

TABLE VALUE CONSTRUCTOR

答案 1 :(得分:1)

您应该进行UnPivot操作。 请注意,在查询末尾添加的Where子句最重要。 没有它,我们就不会告诉SQL Server第二组未透视数据与第一组数据如何匹配。如果没有WHERE,它将进行交叉联接,从而为col2的每个唯一数据生成col1的重复数据。

  declare @tbl as table
(
NormalCol1 varchar(50),
NormalCol2 varchar(50),
col1_0 varchar(50),
col2_0 varchar(50),
col1_1 varchar(50),
col2_1 varchar(50),
col1_2 varchar(50),
col2_2 varchar(50)
)

insert into @tbl
select 'AD','2018-03-02','error','mess','warn','mess','info','mess'



select NormalCol1,NormalCol2,col1,col2 from @tbl
unpivot
(
col1 for details in (col1_0,col1_1,col1_2)
)unp
unpivot
(
col2 for data in (col2_0,col2_1,col2_2)
)unp
WHERE RIGHT(details,1) = RIGHT(data,1)