将键值列分组为单行

时间:2016-02-18 15:08:19

标签: sql sqlite

我试图从SQLite表中提取数据,该表存储双列中的键值对。例如,使用键foobarmanrow,表格如下所示:

| _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   |

我想执行一个查询,该查询将每个external_id连接到一行,其中键作为列,值作为行。像这样:

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

我能够提出的唯一解决方案是每个密钥的加入:

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

有更好的方法吗?

2 个答案:

答案 0 :(得分:6)

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

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 

答案 1 :(得分:0)

你也可以使用collect()方法

select external_id,
collected_objects['foo'] as foo,
collected_objects['bar'] as bar,
collected_objects['man'] as man,
collected_objects['row'] as row
from(
  select external_id,
  collect(key, value) as collected_objects
  group by external_id)t1