如何将具有特定标签的数据组织到新列中?

时间:2018-05-29 09:27:57

标签: sql select sqlite

该表格如

----------------------------
|Date         |label |data |
----------------------------
|"2018-01-01" |"A"   |1.01 |
----------------------------
|"2018-01-02" |"A"   |1.02 |
----------------------------
|"2018-01-01" |"B"   |2.01 |
----------------------------
|"2018-01-02" |"B"   |2.02 |
----------------------------
|"2018-01-01" |"C"   |3.01 |
----------------------------
|"2018-01-02" |"C"   |3.02 |
----------------------------
|"2018-01-01" |"D"   |4.01 |
----------------------------
|"2018-01-02" |"D"   |4.02 |
----------------------------

我想选择具有以下格式的数据:

---------------------------------------
|Date         |"A"  |"B"  |"C"  |"D"  |
---------------------------------------
|"2018-01-01" |1.01 |2.01 |3.01 |4.01 |
---------------------------------------
|"2018-01-02" |1.02 |2.02 |3.02 |4.02 |
---------------------------------------

在我的数据库中,有数千个标签,所以我正在寻找一种方法来按标签自动组织时间序列数据,然后使用标签作为列名。

1 个答案:

答案 0 :(得分:1)

SQLite不支持pivot(我不是特别喜欢),所以使用条件聚合:

select date,
       max(case when label = 'a' then data end) as a,
       max(case when label = 'b' then data end) as b,
       max(case when label = 'c' then data end) as c,
       max(case when label = 'd' then data end) as d
from t
group by date;

不幸的是,SQL查询有一组固定的列。因此,如果您有可变数量的标记,则需要使用动态SQL来生成语句。也就是说,您需要将查询构造为字符串,然后执行它。

此外,数据库对表和结果集中的列数有最大限制。在SQLite中,我认为默认限制是2,000列。这限制了您可以拥有的值的数量。