mysql - 左连接表本身以将行收集到列中

标签 mysql sql left-join

我正在尝试编写一个 View ,将表的数据从垂直“旋转”为水平:

Uid    Name    Key     Value
 1      User1   data1   resultX
 2      User1   data2   resultY
 3      User1   data3   resultZ
 4      User2   data1   resultX
 5      User2   data3   resultZ

生成的数据集应如下所示:

Name     Val1       Val2       Val3
 User1    resultX    resultY    resultZ
 User2    resultX    NULL       resultZ

棘手的是我还想显示空值字段。 我或多或少能实现这一点的唯一方法是使用像这样的子选择 (或多或少意味着:这只适用于存在 key=data1 的数据集):

SELECT 
    t1.name
    , t1.value AS val1
    , t2.value AS val2 
    , t3.value AS val3 
FROM (
    SELECT
        name
        , value
    FROM
        tableA
    WHERE
        key = 'data1'
) t1
LEFT JOIN (
    SELECT
        name
        , value
    FROM
        tableA
    WHERE
        key = 'data2'
) t2
    ON t1.name= t2.name
LEFT JOIN (
    SELECT
        name
        , value
    FROM
        tableA
    WHERE
        key = 'data3'
) t3
    ON t1.name= t3.name
;

是否有更好的方法来实现这一目标?

最佳答案

如果它是已知的一组项目,例如您的情况下的data1、data2和data3,您可以使用以下技术

select 
name,
max(case when `key` = 'data1' then value end) as val1,
max(case when `key` = 'data2' then value end) as val2,
max(case when `key` = 'data3' then value end) as val3  
from tableA group by name ;

关于mysql - 左连接表本身以将行收集到列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29399681/

相关文章:

sql - 带有永远的子查询的 MySQL UPDATE 查询

mysql - 为什么我的 SQL 表创建无法在 Codio 中进行?

sql - 将带有 "' 的字符串插入到 oracle

sql - LEFT OUTER JOIN 未显示 JOIN 右侧缺少的行

mysql - 在不同列之间使用 OR 以及 AND

PHP/SQL : Why does the loop with mysqli_fetch_assoc not work?

java - 防止在 mysql 中四舍五入时间戳

sql - 如何使用 PostgreSQL Function() 在分隔列中返回

python-3.x - SQLite3用LEFT OUTER JOIN模拟RIGHT OUTER JOIN而无法更改表顺序

mysql - JOIN 字段不等于值的表