DB2 SQL列到行

uttx8gqw  于 12个月前  发布在  DB2
关注(0)|答案(2)|浏览(135)

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

_________________________________     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
有没有人能解答这个问题?谢谢

falq053o

falq053o1#

加速器的SQLcode 4772 reason 7表示“查询使用多种编码方案”。
请检查此页面https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/codes/src/tpc/n4742.html。它建议:
如果需要有关无法在加速器中执行语句的原因的详细信息,请发出EXPLAIN语句并检查表DSN_QUERYINFO_TABLE的输出。
其他信息在此page上,其中建议
确保查询引用的所有对象都具有相同的编码方案。
与您的DBA交谈,发现查询中涉及的对象的CCSID,并相应地修改查询,例如使用相同编码的临时表。

n6lpvg4x

n6lpvg4x2#

这表示您的基表。

db2 => WITH BASE(RID, COLUMN1, COLUMN2, COLUMN3) AS  
        (VALUES ('Row 1', 12, 25, 11), 
                ('Row 2', 30, 5, 15)) 
       SELECT * FROM BASE
    
    RID   COLUMN1     COLUMN2     COLUMN3
    ----- ----------- ----------- -----------
    Row 1          12          25          11
    Row 2          30           5          15
    
      2 record(s) selected.

还有这个,你这个专栏作家更简单,不使用联合或sysdummy1

db2 => WITH BASE(RID, COLUMN1, COLUMN2, COLUMN3) AS 
         (VALUES ('Row 1', 12, 25, 11), 
                 ('Row 2', 30, 5, 15)) 
--- in your case, you would start here, selecting directly from your real table 

      SELECT RID, P.COLUMN_NAME, P.COLUMN_VALUE  
      FROM BASE B, TABLE(VALUES 
                          ('Column1', B.COLUMN1 ), 
                          ('Column2', B.COLUMN2 ),  
                          ('Column3', B.COLUMN3 )) 
                   AS P(COLUMN_NAME, COLUMN_VALUE)

RID   COLUMN_NAME COLUMN_VALUE
----- ----------- ------------
Row 1 Column1               12
Row 1 Column2               25
Row 1 Column3               11
Row 2 Column1               30
Row 2 Column2                5
Row 2 Column3               15

  6 record(s) selected.

相关问题