【问题标题】:Concatenate Multiple Row Values into 1 Row, with SQL for iSeries使用 SQL for iSeries 将多行值连接到 1 行
【发布时间】:2016-11-07 14:30:52
【问题描述】:

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

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

桌车:

  • 制作模型
  • 福特 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 Tahoe
  • 本田小型货车奥德赛
  • 福特轿车金牛座
  • 福特轿车福克斯
  • 雪佛兰轿车马里布
  • 福特 SUV Escape
  • 福特 SUV Explorer
  • 雪佛兰轿车黑斑羚

对于结果,我正在寻找:

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

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

谢谢

【问题讨论】:

    标签: sql ibm-midrange iseries-navigator


    【解决方案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
    

    【讨论】:

    • 感谢您的建议。我原以为这样的事情可能会奏效,但事实并非如此。我最终得到的是:雪佛兰 SUV Tahoe;雪佛兰轿车 Tahoe、马里布、黑斑羚;福特 SUV Escape,探险者;福特轿车 Escape,Explorer,Fusion,Taurus,Focus。它似乎在 Type 上中断,但是当它进行连接时,它会添加所有结果。
    • 这很奇怪,因为在连接中我添加了 type = prior type。这样它只会通过 make 和 type 遍历连接。因此,应该只连接相同品牌/类型的模型。
    • 啊,好吧,我错过了您对 CONNECT BY 行的添加,这就是为什么我遇到了我看到的问题(对此感到抱歉)。我现在已经添加了,但仍然有问题。现在我每个 Make 只得到 1 行。雪佛兰 SUV Tahoe;福特 SUV Escape,探险家。
    • 我一定不明白这个问题,我认为这就是你所追求的结果:就像品牌/类型组合在一行中,模型逗号在同一品牌/类型之后分隔。
    • 很高兴为您服务。如果我的解决方案与您最终的解决方案不匹配,我建议您发布您的最终解决方案并接受它作为答案,并简单地将我的投票选为“帮助”。如果这对将来的某人有所帮助,我宁愿指导人们进行正确的活动。
    猜你喜欢
    • 1970-01-01
    • 2012-03-26
    • 2021-12-08
    • 2022-01-10
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多