DB2 SQL 列到行

Posted

技术标签:

【中文标题】DB2 SQL 列到行【英文标题】:DB2 SQL columns to rows 【发布时间】:2018-04-25 09:28:47 【问题描述】:

我正在尝试将列转换为行,如下例所示。

 _________________________________     ROW       | Columns  | values_
      |Column1 | Column2  | Column3   _____________________________
 _________________________________     1         | 1        | 12 
 Row 1|     12  |     25  |     11     1         | 2        | 25
 Row 2|     30  |      5  |     15 --> 1         | 3        | 11
                                       2         | 1        | 30
                                       2         | 2        | 5
                                       2         | 3        | 15

为了解决这个问题,我使用了以下语句

with t as (
      <my query which builds the cross tab>
     )
select t.Row,
       (case when n.n = 1 then Column1
             when n.n = 2 then Column2
             when n.n = 3 then Column3
        end) as values_
from t cross join
     (select 1 as n from sysibm.sysdummy1 union all
      select 2 from sysibm.sysdummy1 union all
      select 3 from sysibm.sysdummy1
     ) n; 

但我收到以下错误

该语句不能由 DB2 或在加速器中执行(原因 7)。 SQLCODE=-4742, SQLSTATE=560D5, DRIVER=4.19.56

有人有解决这个问题的提示吗?谢谢

【问题讨论】:

【参考方案1】:

加速器中的 SQLcode 4772 原因 7 表示“查询使用多种编码方案”。

查看此页面https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/codes/src/tpc/n4742.html。它建议:

"如果您需要更多关于为什么该语句不能被 在加速器中执行,发出 EXPLAIN 语句并检查 表 DSN_QUERYINFO_TABLE 的输出。”

更多信息在此page 上提供建议

确保查询引用的所有对象都具有相同的 编码方案。

与您的 DBA 交谈,发现查询中涉及的对象的 CCSID,并相应地修改查询,例如使用相同编码的临时表。

【讨论】:

我猜想 sysibm.sysdummy1 与您的用户表的 CCSID 不同。也许用你需要的值创建你自己的表。例如。 CREATE TABLE N(N INT NOT NULL PRIMARY KEY); INSERT INTO N VALUES 1; INSERT INTO N VALUES 2;等` select * from table(values(1)) union all select * from table(values(2)) union all select * from table(values(3)) 将替换 sysibm.sysdummy1 引用。

以上是关于DB2 SQL 列到行的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL 中的列到行

在oracle SQL中将行移动到列和列到行

列到行SQL

SQL查询到行到列[重复]

多列,多表列到行 unpivot

具有不同日期的列到行