Sqlite - group_concat成列?

时间:2015-01-14 20:28:08

标签: sql sqlite pivot grouping

是否可以执行类似于group_concat的操作,而不是将值组合成1个逗号分隔的字符串,将它们扩展到表中的多个列中?最初我计划对group_concat值进行分组,然后对字符串进行拆分以将值移动到我需要的列中,但是在SQLite中显然没有拆分选项,我只能在SQLite中直接执行此操作(没有其他数据库的或脚本选项可用)。

要生成我需要制作的报告,我有下表。

Item | Owner | System 
----------------------
A    | Bob   | Sys1
B    | Bob   | Sys1
B    | Sue   | Sys1
B    | Bob   | Sys2
C    | Bob   | Sys3
C    | Sue   | Sys3
C    | Jane  | Sys3

我需要动态地将其连接/转换为这种格式。

Item | Owner 1 | Owner 2 | Owner 3 | Owner 4 | Owner 5 | System
----------------------------------------------------------------
A    | Bob     |         |         |         |         | Sys1
B    | Bob     | Sue     |         |         |         | Sys1
B    | Bob     |         |         |         |         | Sys2
C    | Bob     | Sue     | Jane    |         |         | Sys3

就所有者栏目而言,技术上每件物品最多不应超过5个拥有者,即使有超过5个,我也不在乎显示其他所有者,只要在至少5个出现(也不管在这个场景中哪个5个。)

表格中可以有无限数量的“项目”,大约有20个系统(虽然系统数量会发生变化)

这只能使用SQlite吗?

1 个答案:

答案 0 :(得分:0)

您需要在表格中设置自动增量ID才能实现此目标

SQLLite没有row_number分析函数,它没有pivot关键字

这里我们使用相关的子查询生成row_number,并基于此选择为每个项目系统提供5个所有者。

select Item,System,
       max( case when rn =1 then Owner end ) as Owner1,
       max( case when rn =2 then Owner end ) as Owner2,
       max( case when rn =3 then Owner end ) as Owner3,
       max( case when rn =4 then Owner end ) as Owner4,
       max( case when rn =5 then Owner end ) as Owner5
from (
select Item, System, Owner,
       (select count(*) from Table1 b  where a.Item = b.Item and a.System = b.System
                                                          and a.id >= b.id) as rn
from Table1 a) T
group by Item,System
相关问题