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如何按列转置行的主要内容,如果未能解决你的问题,请参考以下文章