Sqlite - group_concat到列中?

xkrw2x1b  于 2023-08-06  发布在  SQLite
关注(0)|答案(1)|浏览(107)

有没有可能做一些类似于group_concat的事情,只是不是将值组合成一个逗号分隔的字符串,而是将它们扩展到表中的多个列中?最初,我计划group_concat值,然后对字符串进行拆分,将值移动到我需要的列中,但显然SQLite中没有split选项,我只能直接在SQLite中这样做(没有其他DB或脚本选项可用)。
为了生成我需要的报告,我有下表。

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?

krcsximq

krcsximq1#

你需要在你的表中有自动递增id来实现这一点
SQLLite没有row_number解析函数,没有pivot关键字
在这里,我们使用相关子查询生成row_number,并基于此选择每个Item,System的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

字符串

相关问题