2016-11-07 36 views
2

首先,我需要感谢Kent Milligan和他的文章http://www.mcpressonline.com/sql/techtip-combining-multiple-row-values-into-a-single-row-with-sql-in-db2-for-i.html,因为我已经解决了这个问题。但是现在我需要扩展他在这里做的事情。将多行值连接成1行,使用SQL for iSeries

为了避免您不得不转到他的文章,他提到的问题是将来自多行的字符串数据连接到结果表中的单个行中。例如:

表汽车:

  • 品牌型号
  • 福特Fusion
  • 雪佛兰太浩
  • 本田奥德赛
  • 福特Taurus
  • 福特福克斯
  • 雪佛兰Malibu的

结果:

  • 品牌型号
  • 雪佛兰Malibu的,太浩
  • 福特福克斯,金牛座,融合
  • 本田奥德赛

这是用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 

我能够适应我的桌子,并获得我想要的大部分方式。但为了我的目的,我需要为分组添加一个额外的列。例如:

表汽车:

  • 制式型号
  • 福特轿车融合
  • 雪佛兰SUV塔霍
  • 本田面包车奥德赛
  • 福特轿车金牛座
  • 福特轿车福克斯
  • Chevy Sedan Malibu
  • 福特SUV逃生
  • 福特SUV Explorer中
  • 雪佛兰轿车帕拉

对于结果,我会寻找:

  • 制式型号
  • 雪佛兰Malibu的轿车,Impala
  • Chevy SUV Tahoe
  • 福特轿车的融合,金牛座,重点
  • 福特SUV逃生,资源管理器
  • 本田面包车奥德赛

有没有人有什么我需要添加到原来的语句,能够添加任何的想法TYPE列,并在相应的组?我尝试了一些东西,但我怀疑我需要用CONNECT_BY_PATH语句做些什么,我只是不确定是什么。

谢谢

回答

1

我想你只是需要整合类型在查询的正确点。

没有能够测试,我认为这将是接近;但我可能错过了一些东西......

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 

也许我们需要做改变连接通过做CONCAT之前...连接,虽然我不明白为什么这会帮助尚未...

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

谢谢你的建议。我曾经想过这样的事情可能会奏效,但事实并非如此。我最终得到的是:Chevy SUV Tahoe; Chevy Sedan Tahoe,Malibu,Impala;福特SUV逃生,探险家;福特轿车逃生,探险家,融合,金牛座,焦点。它似乎打破了类型,但是当它进行连接时,它会添加所有结果。 – Andrew

+0

这很奇怪,因为在连接时我添加了type = prior类型。所以它只能通过make和type来遍历连接。因此只应连接相同品牌/型号的型号。 – xQbert

+0

啊,呃,我错过了你对CONNECT BY行的补充,这就是为什么我遇到了我看到的问题(对此很抱歉)。我现在补充说,但仍然有问题。现在我只为每个Make获得1行。雪佛兰SUV Tahoe;福特SUV逃生,探险家。 – Andrew