将多个行值连接成 1 行,iSeries 为 SQL
Concatenate Multiple Row Values into 1 Row, with SQL for iSeries
首先,我要感谢 Kent Milligan 和他在 http://www.mcpressonline.com/sql/techtip-combining-multiple-row-values-into-a-single-row-with-sql-in-db2-for-i.html 上的文章,是他们让我在这个问题上走得更远。但现在我需要扩展他在这里所做的事情。
为了避免您不得不去看他的文章,他解决的问题是在结果 table 中将来自多行的字符串数据连接成一行。例如:
Table 汽车:
- 制作模型
- 福特融合
- 雪佛兰太浩
- 本田奥德赛
- 福特金牛座
- 福特福克斯
- 雪佛兰马里布
结果:
- 制作模型
- 雪佛兰马里布,塔霍
- 福特福克斯、金牛座、融合
- 本田奥德赛
这是通过 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
我能够根据我自己的 table 调整它,并获得我想要到达的大部分方式。但出于我的目的,我需要为分组添加一个额外的列。例如:
Table 汽车:
- 制作类型模型
- 福特轿车 Fusion
- 雪佛兰 SUV Tahoe
- 本田小型货车奥德赛
- 福特轿车金牛座
- 福特轿车福克斯
- 雪佛兰马里布轿车
- 福特 SUV Escape
- 福特 SUV Explorer
- 雪佛兰轿车Impala
对于结果,我会寻找:
- 制作类型模型
- 雪佛兰马里布轿车,Impala
- 雪佛兰 SUV Tahoe
- 福特轿车 Fusion、金牛座、福克斯
- 福特 SUV Escape、Explorer
- 本田小型货车奥德赛
有没有人对我需要添加到原始语句中的所有内容有任何想法,以便能够添加 TYPE 列,并相应地添加 GROUP?我已经尝试了一些事情,但我怀疑我需要对 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
首先,我要感谢 Kent Milligan 和他在 http://www.mcpressonline.com/sql/techtip-combining-multiple-row-values-into-a-single-row-with-sql-in-db2-for-i.html 上的文章,是他们让我在这个问题上走得更远。但现在我需要扩展他在这里所做的事情。
为了避免您不得不去看他的文章,他解决的问题是在结果 table 中将来自多行的字符串数据连接成一行。例如:
Table 汽车:
- 制作模型
- 福特融合
- 雪佛兰太浩
- 本田奥德赛
- 福特金牛座
- 福特福克斯
- 雪佛兰马里布
结果:
- 制作模型
- 雪佛兰马里布,塔霍
- 福特福克斯、金牛座、融合
- 本田奥德赛
这是通过 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
我能够根据我自己的 table 调整它,并获得我想要到达的大部分方式。但出于我的目的,我需要为分组添加一个额外的列。例如:
Table 汽车:
- 制作类型模型
- 福特轿车 Fusion
- 雪佛兰 SUV Tahoe
- 本田小型货车奥德赛
- 福特轿车金牛座
- 福特轿车福克斯
- 雪佛兰马里布轿车
- 福特 SUV Escape
- 福特 SUV Explorer
- 雪佛兰轿车Impala
对于结果,我会寻找:
- 制作类型模型
- 雪佛兰马里布轿车,Impala
- 雪佛兰 SUV Tahoe
- 福特轿车 Fusion、金牛座、福克斯
- 福特 SUV Escape、Explorer
- 本田小型货车奥德赛
有没有人对我需要添加到原始语句中的所有内容有任何想法,以便能够添加 TYPE 列,并相应地添加 GROUP?我已经尝试了一些事情,但我怀疑我需要对 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