使用CASE的键|值表旋转&Q;将返回空列...MySQL

2022-06-06 00:00:00 pivot key-value group-by mysql

我正在尝试将键|值格式的数据转换为每个条目一行。源数据库是MySQL,我知道我需要使用CASE语句才能透视,并在此站点上遵循了一些示例来构造我的查询。

但是,我只能取回一列数据,其余列中有空格。

源表格式

用户ID 元密钥 Meta_Value
1 名字 约翰
1 Key_2 ETC

查询

 SELECT `user_id`,
 case when `meta_key`='key_1' then `meta_value` else '' end as `key_1`,
 case when `meta_key`='key_2' then `meta_value` else '' end as `key_2`,
 case when `meta_key`='key_3' then `meta_value` else '' end as `key_3`,
 case when `meta_key`='key_4' then `meta_value` else '' end as `key_4`,
 case when `meta_key`='key_5' then `meta_value` else '' end as `key_5`,
 case when `meta_key`='key_6' then `meta_value` else '' end as `key_6`,
 case when `meta_key`='key_7' then `meta_value` else '' end as `key_7`
 from
       (select `user_id`, `meta_key`, `meta_value`
         from `source_table`
        where `user_id`='1'
          and `meta_key` in     
            ('key_1','key_2','key_3','key_4','key_5','key_6','key_7')) x
 group by `user_id`

结果

用户ID Key_1 Key_2 Key_3 Key_4
1 约翰

我可以清楚地看到问题在于它采用了它找到的第一个值,并使用该行填充整个表。我不知道的是如何阻止它这样做。

因为此透视的目的是将数据从一个安全数据库转换到另一个安全数据库(没有可用的集成),所以如果可以避免的话,我真的不想将其作为临时步骤放到电子表格中。

谁能建议...?


解决方案

请尝试

SELECT `user_id`,
 MAX(case when `meta_key`='key_1' then `meta_value` else '' end) as `key_1`,
 MAX(case when `meta_key`='key_2' then `meta_value` else '' end) as `key_2`,
 MAX(case when `meta_key`='key_3' then `meta_value` else '' end) as `key_3`,
 MAX(case when `meta_key`='key_4' then `meta_value` else '' end) as `key_4`,
 MAX(case when `meta_key`='key_5' then `meta_value` else '' end) as `key_5`,
 MAX(case when `meta_key`='key_6' then `meta_value` else '' end) as `key_6`,
 MAX(case when `meta_key`='key_7' then `meta_value` else '' end) as `key_7`
 from
 (select `user_id`, `meta_key`, `meta_value` from `source_table`
 where `user_id`='1' and `meta_key` in     ('key_1','key_2','key_3','key_4','key_5','key_6','key_7')) x
 group by `user_id

相关文章