【问题标题】:Mapping of Multi-valued column from one table to another table using join in DB2使用 DB2 中的连接将多值列从一个表映射到另一个表
【发布时间】:2017-08-11 04:41:24
【问题描述】:

我正在使用 DB2 中的 SQL 创建一个报告,并且我在其中一个表中有一个字段来存储多个值。现在,我需要引用另一个表来获取这些多个值的描述,如图所示。

表 A

Item_No| R_code
---------------

 X       R01,R03,R04
 Y       R02,R03
 Z       R04

表 B

R_code| Description
------------------

R01      Missing info
R02      Invalid info
R03      Invalid Account
R04      Missing Address

如果我加入表A和表B,我如何得到以下结果

最终结果

Item_no| R_code     | Description
---------------------------

 X      R01,R03,R04  Missing info,Invalid Account,Missing Address
 Y      R02,R03      Invalid info,Invalid Account
 Z      R04          Missing Address

【问题讨论】:

  • 这将非常混乱 - 这应该真的被规范化...
  • @Siyual:这就是数据存储在表 A 中的方式,我需要以某种方式将值映射到表 B。这主要用于报告目的,所以我需要使用现有数据
  • 我会使用用户定义函数来处理这个问题。
  • 您必须首先执行反(反向)列表 agg 以获取单独行上的值,然后进行简单连接,然后使用 list_agg 将它们放回:ibm.com/developerworks/community/blogs/SQLTips4DB2LUW/entry/…
  • 谁能告诉我如何获得所需结果集的步骤?

标签: sql db2


【解决方案1】:
WITH unpivot (lvl, item_no, r_code, tail) AS (
  SELECT 1, item_no,
         CASE WHEN LOCATE(',',r_code) > 0 
              THEN TRIM(LEFT(r_code, LOCATE(',',r_code)-1))
              ELSE TRIM(r_code) 
        END,
         CASE WHEN LOCATE(',',r_code) > 0 
              THEN SUBSTR(r_code, LOCATE(',',r_code)+1)
              ELSE '' 
         END
  FROM tableA
  UNION ALL
  SELECT lvl + 1, item_no,
         CASE WHEN LOCATE(',', tail) > 0 
              THEN TRIM(LEFT(tail, LOCATE(',', tail)-1))
              ELSE TRIM(tail) 
         END,
         CASE WHEN LOCATE(',', tail) > 0 
              THEN SUBSTR(tail, LOCATE(',', tail)+1)
              ELSE '' 
         END
    FROM unpivot 
   WHERE lvl < 100 AND tail != ''),

get_desc AS
(
  SELECT item_no, up.r_code, tb.description
    FROM unpivot up
   INNER JOIN tableB tb
      ON up.item_no = tb.item_no
)

SELECT item_no,
       LISTAGG(r_code, ', ' ) WITHIN GROUP(ORDER BY r_code ASC) AS r_code,
       LISTAGG(description, ', ') WITHIN GROUP(ORDER BY description ASC) AS description
  FROM get_desc

【讨论】:

  • 感谢您的询问!你能详细说明使用的逻辑吗?
  • 我想提一下,我需要在另一个查询中使用此数据进行报告。那么如何将数据传递到我的报告查询中呢?我需要发送具有多个值的数据,如上图所示(最终结果)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 2010-10-20
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
相关资源
最近更新 更多