sql - 将键值列分组为一行

标签 sql sqlite

我正在尝试从在双列中存储键值对的 SQLite 表中提取数据。例如,使用 key foo , bar , man , 和 row ,该表将如下所示:

| _id | external_id | key  | value |
|-----|-------------|------|-------|
| 1   | 12345       | foo  | cow   |
| 2   | 12345       | bar  | moo   |
| 3   | 12345       | man  | hole  |
| 4   | 12345       | row  | boat  |
| 5   | 67980       | foo  | abc   |
| 6   | 67890       | bar  | def   |
| 7   | 67890       | man  | ghi   |
| 8   | 67890       | row  | jkl   |

I want to perform a query that gives me each external_id in a row with the keys as the columns and the values as the rows. Like this:

| external_id | foo |  bar | man  | row  |
|-------------|-----|------|------|------|
| 12345       | cow | moo  | hole | boat |
| 67890       | abc | def  | ghi  | jkl  |

The only solution I've been able to come up with is a join for each key:

SELECT a.external_id, b.foo, c.bar, d.main, e.row 
FROM myTable AS a
LEFT JOIN 
  (SELECT external_id, key AS foo
   FROM myTable
   WHERE key="foo") AS b
   ON a.external_id = b.external_id
...
LEFT JOIN 
  (SELECT external_id, key AS row
   FROM myTable
   WHERE key="row") AS e
   ON a.external_id = e.external_id
GROUP BY a.external_id

有一个更好的方法吗?

最佳答案

另一个可用的选项是使用条件聚合:

SELECT external_id,
       MAX(CASE WHEN key = 'foo' THEN value END) AS foo,
       MAX(CASE WHEN key = 'bar' THEN value END) AS bar,
       MAX(CASE WHEN key = 'man' THEN value END) AS man,
       ... etc
FROM mytable 
GROUP BY external_id 

关于sql - 将键值列分组为一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35485132/

相关文章:

mysql - 如何计算值

sql - 在 PostgreSQL 中运行 N 个独立列更新的最佳方法是什么? SQL 规范中最好的方法是什么?

android - 无法迁移到 Room

sqlite - 给出仅包含来自另一个表的字符串的字符串选择

r - 使用 dplyr 过滤 SQLite 数据库时,是否应该避免 `|`?

android - 将 ViewModel 与 SQLite 数据库而非 Room 数据库一起使用

sql - 将列除以另一列分组的总和

java - MYSQL 和 SQuirreL - 尝试打开 SQL 连接时发生意外错误

SQLite 比较 2 个表的查询

sql - 如何根据 Postgres 中的过滤条件更新深度嵌套的 JSON 对象?