使用SQL for iSeries将多个行值连接到一行中

使用SQL for iSeries将多个行值连接到一行中,sql,ibm-midrange,iseries-navigator,Sql,Ibm Midrange,Iseries Navigator,首先,我要感谢肯特·米利根和他的文章,感谢他让我在这个问题上走得这么远。但现在我需要进一步阐述他在这里所做的工作 为了避免阅读他的文章,他解决的问题是将多行中的字符串数据连接到结果表中的一行中。例如: 桌车: 制作模型 福特Fusion 雪佛兰塔霍 本田奥德赛 福特金牛座 福特福克斯 雪佛兰马里布 结果: 制作模型 塔霍岛马里布雪佛兰 福特福克斯、金牛座、Fusion 本田奥德赛 这是通过SQL语句完成的: WITH numbered_sets(make, model, curr, pr

首先,我要感谢肯特·米利根和他的文章,感谢他让我在这个问题上走得这么远。但现在我需要进一步阐述他在这里所做的工作

为了避免阅读他的文章,他解决的问题是将多行中的字符串数据连接到结果表中的一行中。例如:

桌车:

  • 制作模型
  • 福特Fusion
  • 雪佛兰塔霍
  • 本田奥德赛
  • 福特金牛座
  • 福特福克斯
  • 雪佛兰马里布
结果:

  • 制作模型
  • 塔霍岛马里布雪佛兰
  • 福特福克斯、金牛座、Fusion
  • 本田奥德赛
这是通过SQL语句完成的:

WITH numbered_sets(make, model, curr, prev) AS (
   SELECT make, model,
       ROW_NUMBER() OVER (PARTITION BY make ORDER BY model) AS curr,
       ROW_NUMBER() OVER (PARTITION BY make ORDER BY model) -1 AS prev
   FROM inventory)
SELECT make,
       MAX (TRIM(L ',' FROM
             CAST(SYS_CONNECT_BY_PATH(model, ',') AS VARCHAR(256)) ))
FROM numbered_sets
START WITH curr = 1
CONNECT BY make = PRIOR make AND prev = PRIOR curr
GROUP BY make
我能够将它适应我自己的桌子,并得到我想要得到的大部分方式。但出于我的目的,我需要为分组添加一个额外的列。例如:

桌车:

  • 制作类型模型
  • 福特轿车Fusion
  • 雪佛兰SUV塔霍
  • 本田迷你奥德赛
  • 福特轿车金牛座
  • 福特轿车焦点
  • 马里布雪佛兰轿车
  • 福特SUV逃生车
  • 福特SUV探索者
  • 雪佛兰轿车黑斑羚
对于结果,我希望:

  • 制作类型模型
  • 雪佛兰轿车马里布,黑斑羚
  • 雪佛兰SUV塔霍
  • 福特轿车Fusion、金牛座、福克斯
  • 福特SUV逃生车,探险家
  • 本田迷你奥德赛
有没有人对我需要添加到原始语句中的内容有什么想法,以便能够添加TYPE列,并据此分组?我尝试了一些方法,但我怀疑我需要使用CONNECT_BY_PATH语句来做些什么,我只是不确定是什么


谢谢你

我认为你只需要在正确的点上集成类型,而不必考虑查询

如果无法进行测试,我认为这将非常接近;但我可能错过了什么

WITH numbered_sets(make, type, model, curr, prev) AS (
   SELECT make, type, model,
       ROW_NUMBER() OVER (PARTITION BY make, Type ORDER BY Make, Type, model) AS curr,
       ROW_NUMBER() OVER (PARTITION BY make, type ORDER BY Make, type, model) -1 AS prev
   FROM inventory)
SELECT make, Type
       MAX (TRIM(L ',' FROM
             CAST(SYS_CONNECT_BY_PATH(model, ',') AS VARCHAR(256)) ))
FROM numbered_sets
START WITH curr = 1
CONNECT BY make = PRIOR make AND prev = PRIOR curr and type = prior type
GROUP BY make, type
也许我们需要在连接之前更改连接方式以进行连接。。。虽然我不明白为什么这会有帮助

CONNECT BY concat(make,type) = PRIOR concat(make,type) AND prev = PRIOR curr

谢谢你的建议。我原以为那样可能行得通,但行不通。我最终得到的是:雪佛兰SUV Tahoe;雪佛兰轿车塔霍,马里布,黑斑羚;福特SUV逃逸,探险家;福特轿车逃逸,探险家,融合,金牛座,焦点。它似乎在类型上中断,但当它进行连接时,它正在添加所有结果。这很奇怪,因为在connectby I added Type=previor Type中。这样它就只能通过make和type遍历连接。因此,应该只连接相同品牌/类型的型号。啊,好吧,我错过了您添加到“连接方式”中的内容,这就是我遇到问题的原因(很抱歉)。我现在已经补充了这一点,但仍然有一个问题。现在,我只得到一条线,每一个品牌。雪佛兰SUV塔霍;福特SUV Escape,探险家。我一定不明白这个问题,我想这就是你想要的结果:就像品牌/类型组合在一行,型号逗号分隔后为同一品牌/类型。很高兴为您服务。如果我的解决方案与您最终的解决方案不匹配,我建议发布您的最终解决方案,并接受该解决方案作为答案,然后简单地将我的投票选为“帮助”。如果这对将来的人有帮助,我宁愿引导人们进行正确的活动。