2

首先,我要感谢 Kent Milligan 和他在http://www.mcpressonline.com/sql/techtip-combining-multiple-row-values-into-a-single-row-with-sql-in-db2-上的文章for-i.html让我尽可能地解决这个问题。但现在我需要扩展他在这里所做的事情。

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

桌车:

  • 制作模型
  • 福特融合
  • 雪佛兰太浩
  • 本田奥德赛
  • 福特金牛座
  • 福特福克斯
  • 雪佛兰马里布

结果:

  • 制作模型
  • 雪佛兰马里布,太浩
  • 福特福克斯,金牛座,融合
  • 本田奥德赛

这是通过 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 太浩
  • 本田小型货车奥德赛
  • 福特轿车金牛座
  • 福特轿车福克斯
  • 雪佛兰轿车 Malibu
  • 福特 SUV 逃生
  • 福特 SUV 探险家
  • 雪佛兰轿车黑斑羚

对于结果,我会寻找:

  • 制作类型模型
  • 雪佛兰轿车 Malibu,黑斑羚
  • 雪佛兰 SUV 太浩
  • 福特轿车 Fusion,金牛座,福克斯
  • 福特 SUV Escape, Explorer
  • 本田小型货车奥德赛

有人对我需要添加到原始语句中的所有内容有任何想法,以便能够添加 TYPE 列,并相应地添加 GROUP 吗?我已经尝试了一些事情,但我怀疑我需要对 CONNECT_BY_PATH 语句做一些事情,我只是不确定是什么。

谢谢

4

1 回答 1

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

也许我们需要在 connect by 之前更改 connect by 以进行 concat ......虽然我不明白为什么这会有所帮助......

CONNECT BY concat(make,type) = PRIOR concat(make,type) AND prev = PRIOR curr
于 2016-11-07T14:46:39.603 回答