mysql - 将多列转置为行 - MySQL

标签 mysql sql stored-procedures

我有很多数据需要迁移到新表。但是,表结构发生了变化。

所以我的问题是,我需要构建一个 MySQL 查询或 SPproc,它将实现以下目标:

我目前的数据集如下:

uuid                                    level0     level1     level2 

FFC28DA7-9753-4D83-BAFF-A3623EAF6545    Insurance           
2A772655-E580-40BC-B08F-4D279AEEEC74    Profile    Age_Group    25-34   
2A772655-E580-40BC-B08F-4D279AEEEC74    Profile    Gender         M 
2A772655-E580-40BC-B08F-4D279AEEEC74    Profile    State         NSW    
2A772655-E580-40BC-B08F-4D279AEEEC74    Profile    Country        AU    
821B10BC-EED7-4E72-A77D-5119A2C28331    Profile    Age_Group    25-34   
821B10BC-EED7-4E72-A77D-5119A2C28331    Profile     Gender        M 
FFC28DA7-9753-4D83-BAFF-A3623EAF6545    Insurance   Health  

这样的记录有很多。

但是现在需要将数据迁移到新表中,因此看上面的数据集,需要是这样的

uuid                                    taxid_n     

FFC28DA7-9753-4D83-BAFF-A3623EAF6545    Insurance   
FFC28DA7-9753-4D83-BAFF-A3623EAF6545    Health
2A772655-E580-40BC-B08F-4D279AEEEC74    Profile
2A772655-E580-40BC-B08F-4D279AEEEC74    Age_Group
2A772655-E580-40BC-B08F-4D279AEEEC74    25-34
2A772655-E580-40BC-B08F-4D279AEEEC74    Gender
2A772655-E580-40BC-B08F-4D279AEEEC74    M
2A772655-E580-40BC-B08F-4D279AEEEC74    State
2A772655-E580-40BC-B08F-4D279AEEEC74    NSW
2A772655-E580-40BC-B08F-4D279AEEEC74    Country
2A772655-E580-40BC-B08F-4D279AEEEC74    AU
821B10BC-EED7-4E72-A77D-5119A2C28331    Profile
821B10BC-EED7-4E72-A77D-5119A2C28331    Age_Group
821B10BC-EED7-4E72-A77D-5119A2C28331    25-34
821B10BC-EED7-4E72-A77D-5119A2C28331    Gender
821B10BC-EED7-4E72-A77D-5119A2C28331    M

所以基本上,每个级别都会是一个新行,加上父级别level0,不会重复。即“个人资料”>“性别”>“男性”和“个人资料”>“ child ”>“性别”>“男性”,根据 uuid,将有 6 条记录,而不是 7 条。 uuid 将是唯一的。

注意:有 6 个级别,即 level0 - level5,因此查询或 SProc 应该容纳它。

获取原始数据的查询是:

 SELECT 
uuid,
level0,    level1,
level2,    level3,
level4,    level5,
level6,    pubid,
siteid,    ipaddress,
dt,    status,
created, now ()
FROM
segmentdata
WHERE
status = 1

对此的任何帮助都会很棒!

谢谢

最佳答案

您可以使用联合来做到这一点

select uid, level0 as level from segmentdata
union
select uid, level1 from segmentdata
union
select uid, level2 from segmentdata
union
select uid, level3 from segmentdata
union
select uid, level4 from segmentdata
union
select uid, level5 from segmentdata;

union 将删除重复项。

关于mysql - 将多列转置为行 - MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32085322/

相关文章:

sql - MySQL Sum 基于日期范围和一天中的时间

mysql - 存储过程 - OUT 参数在选择时返回 null

c# - Entity Framework 从存储过程创建错误的模型

sql - 如何在 Redshift 中实现窗口运行中位数?

MySQL从条件返回所有数据

entity-framework - Entity Framework 仅与存储过程

mysql - 如何更快地加载 vb.net Combobox

mysql - mysql-table 列中的溢出值

mysql - 循环遍历mysql表数据

php - SQL 查询未提供结果