MySQL如何按列转置行

Posted

技术标签:

【中文标题】MySQL如何按列转置行【英文标题】:MySQL how to transpose rows by columns 【发布时间】:2020-08-23 22:18:27 【问题描述】:

我的表有它的 ID、2 个外键和值;第一个外键成为“ID”

通过这个查询,我从 谓词(它是 2 FK,主题 1 FK)及其值中得到了我正在寻找的东西。

select subject AS 'id', predicate AS 'FK', object AS 'Value' from oer_moretriples where predicate in (3 ,4, 34, 35) order by subject;

输出

| ID | FK | Value |
|----------|:-------------:|------:|
| 847 | 3 | "Michael Tiemeyer" |
| 847 | 4 | "N/A" |
| 1062 | 3 | "Wendy Kurant" |
| 1062 | 4 | "N/A" |
| 1749 | 34 | "Bonnie J. Robinson" |
| 1749 | 35 | "N/A" |
| 7182 | 34 | "J. Franklin Williamson" |
| 7182 | 35 | "N/A" |
| 7183 | 3 | "Molly Zhou" |
| 7183 | 4 | "N/A" |

想要的结果

| ID | author | link |
|----------|:-------------:|------:|
| 847 | "Michael Tiemeyer" | "N/A" |
| 1062 | "Wendy Kurant" | "N/A" |
| 1749 | "Bonnie J. Robinson | "N/A" |
| 7182 | "J. Franklin Williamson" | NULL |
| 7183 | "Molly Zhou" | NULL |

3 和 35 具有相同的名称信息。 另一方面,4 和 34 具有与该名称对应的链接。

我解释: 3->“丹尼尔” 4 -> 链接丹尼尔 现在如果 3 中没有文本,则表示名称在 35 (35 -> "Daniel") 中,当然还有 l4 (4 -> linkDaniel) 中的链接,如果不是 3,则 , 搜索 35 和礼物;否则没有“N / A”。

目前我有这个问题

SELECT subject AS 'codeAuthor',
       (CASE WHEN predicate = 3 THEN object END) nameAuthor,
       (CASE WHEN predicate = 4 THEN object END) linkAuthor,
       (CASE WHEN predicate = 35 THEN object END) author,
       (CASE WHEN predicate = 34 THEN object END) link_Author
FROM oer_moretriples
where predicate in (3, 4, 34, 35)
#GROUP BY subject
ORDER BY subject;
| codeAuthor | nameAuthor | linkAuthor | author | link_Author |
|----------|:-------------:|------:|
| 847 | "Michael Tiemeyer" | NULL | NULL | NULL |
| 847 | NULL | "N/A" | NULL | NULL |
| 1062 | "Wendy Kurant" | NULL | NULL | NULL |
| 1062 | NULL | "N/A" | NULL | NULL |
| 1749 | "Bonnie J. Robinson" | NULL | NULL | NULL |
| 1749 | NULL | "N/A" | NULL | NULL |
| 7182 | "J. Franklin Williamson" | NULL | NULL | NULL |
| 7182 | NULL | "N/A" | NULL | NULL |
| 7183 | "Molly Zhou" | NULL | NULL | NULL |
| 7183,NULL,"""N/A""",NULL,NULL |

GROUP BY 子句只是消除了重复的行,总之希望你能帮助我并理解我问什么哈哈

【问题讨论】:

请看Why should I provide an MCRE for what seems to me to be a very simple SQL query 使用 max/min 消除 NULL。一般规则是 NULL 会被 MAX/MIN 等聚合函数忽略,因此在 case 语句中添加 max/min 将删除 NULL。 【参考方案1】:

我认为你想要的逻辑是:

SELECT 
    subject AS codeAuthor,
    MAX(CASE WHEN predicate IN (3, 35) THEN object END) author,
    MAX(CASE WHEN predicate IN (4, 34) THEN object END) link
FROM oer_moretriples
WHERE predicate in (3, 4, 34, 35)
GROUP BY subject
ORDER BY subject

【讨论】:

似乎如果,虽然因为使用了MAX,有助于知道2 (3, 35) 中的哪一个具有值(但是如果两者都应用了 max 会发生什么)谢谢我一直很忙

以上是关于MySQL如何按列转置行的主要内容,如果未能解决你的问题,请参考以下文章

如何从列转置到行?

Tsql 将行转置为列,按列分组

红移。我们如何(动态地)将表从列转置为行?

oracle sql 11G中如何将列转置为行

将列转置为行 SQL Server

oracle如何在没有UNION的情况下将列转置为行