Sqlite - group_concat到列中?

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

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

  1. Item | Owner | System
  2. ----------------------
  3. A | Bob | Sys1
  4. B | Bob | Sys1
  5. B | Sue | Sys1
  6. B | Bob | Sys2
  7. C | Bob | Sys3
  8. C | Sue | Sys3
  9. C | Jane | Sys3

字符串
我需要将它动态地转换成这个格式。

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


就所有者列而言,从技术上讲,每个项目的所有者最多不应该超过5个,即使超过5个,我也不在乎显示额外的所有者,只要至少有5个出现(在这个场景中也不在乎是哪5个)。
表中可以有无限数量的“项目”,大约有20个系统(尽管系统计数会改变)
这是否可能只使用SQlite?

krcsximq

krcsximq1#

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

  1. select Item, System,
  2. max(case when rn = 1 then Owner end) as Owner1,
  3. max(case when rn = 2 then Owner end) as Owner2,
  4. max(case when rn = 3 then Owner end) as Owner3,
  5. max(case when rn = 4 then Owner end) as Owner4,
  6. max(case when rn = 5 then Owner end) as Owner5
  7. from (
  8. select Item, System, Owner, (
  9. select count(*)
  10. from Table1 b
  11. where a.Item = b.Item and a.System = b.System
  12. and a.id >= b.id) as rn
  13. from Table1 a) T
  14. group by Item, System

字符串

展开查看全部

相关问题