【问题标题】:dynamic pivot in db2db2 中的动态枢轴
【发布时间】:2019-05-01 04:21:33
【问题描述】:

所以当您将行转换为列时,我们在 Oracle /SQL Server 中有 PIVOT 关键字。 不在 DB2 中,我想动态地转换行结果并将它们连接成一列,例如,我不知道我可能得到的行数,它们可能会有所不同。 例如 表x

COL1  COL2
ABC  10
ABC  20
ABC  30

我想把它显示为

COL1  COL2
ABC   10,20,30

但是记录的数量可能会有所不同,所以我不能使用案例。

想要对许多表的查询而不是特定查询执行此操作;一个函数,或者最好是在选择查询本身中。

【问题讨论】:

  • 究竟是哪个 DB2“品牌”?卢威? i系列? Z/操作系统? DB2 LUW 支持 listagg():stackoverflow.com/questions/7188542
  • 嗨,是的 db2 LUW。是的,我确实使用了 LISTAGG() 并且它可以工作,但是在连接之后,经过一定的限制,它会给我带来大小错误。有什么解决方法吗?使用 CAST 是一个选项,例如: LISTAGG(CAST( AS VARGRAPHIC(10000)), ', ') 但它仍然保留固定长度。
  • LISTAGG 被限制为最大 VARCHAR 长度,即 32000 字节左右
  • 感谢您的回复。我明白了,无论如何这可以是动态的,因为我必须保留 32000,如果字符串增加 32000 怎么办?有什么解决方法的想法吗?

标签: sql db2 db2-luw string-aggregation listagg


【解决方案1】:

如果您使用的是 Db2 LUW 11.1.4.4 版本,您或许可以使用 sysibm.json_array function 解决问题:

VALUES JSON_ARRAY(SELECT DEPTNO FROM DEPT);

1
-------------------------------
["F22","G22","H22","I22","J22"]

然后您可以将 json_array 存储在基于字符的列中,varcharclob

【讨论】:

    【解决方案2】:

    对于较长的字符串。

    select substr(xmlserialize(
    xmlquery('$L/text()' passing XMLAGG(xmlelement(name "a", ','||colname)) as "L")
    as clob(1m)
    ), 2)
    from syscat.columns;
    

    【讨论】:

      猜你喜欢
      • 2011-06-26
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多