如何使用DB2 SQL的SELECT语句将表格转换为交叉表(CROSSTAB)
在DB2 SQL中实现行转列(交叉表)的方法
嗨,我来帮你搞定这个DB2里转交叉表的需求!根据你给出的原始表结构和期望输出,有两种实用的方法可以实现,我都给你详细说明下:
方法一:使用CASE WHEN + 聚合函数(兼容性最强)
这种方法适用于所有版本的DB2,不管是旧版本还是新版本都能跑通。假设你的原始表名为source_table,可以用下面的SQL:
SELECT CONCAT('Row ', ROW) AS RowLabel, MAX(CASE WHEN Columns = 1 THEN VALUES END) AS Column1, MAX(CASE WHEN Columns = 2 THEN VALUES END) AS Column2, MAX(CASE WHEN Columns = 3 THEN VALUES END) AS Column3 FROM source_table GROUP BY ROW ORDER BY ROW;
逻辑说明:
GROUP BY ROW把同一行编号的记录聚合到一起;- 每个
CASE WHEN语句会判断Columns的值,匹配上就返回对应的VALUES,否则返回NULL; - 用
MAX()聚合函数是为了在分组结果里只保留那个非空的有效值(因为其他不匹配的CASE会返回NULL,MAX会自动忽略NULL)。你也可以用SUM(),效果完全一样,因为每个分组里每个Columns值只会对应一条记录。
方法二:使用PIVOT函数(更简洁,适用于DB2 10.5及以上版本)
如果你的DB2版本是10.5或更高,支持PIVOT语法的话,可以用更简洁的写法:
SELECT CONCAT('Row ', ROW) AS RowLabel, Column1, Column2, Column3 FROM source_table PIVOT ( MAX(VALUES) FOR Columns IN (1 AS Column1, 2 AS Column2, 3 AS Column3) ) AS pivoted_table ORDER BY ROW;
逻辑说明:
PIVOT子句里指定聚合函数(这里用MAX,理由和上面一样);FOR Columns IN (...)定义要把Columns里的哪些值转成列,同时给新列命名;- 最后给转置后的表起个别名
pivoted_table,这是DB2语法要求的。
额外提示:
如果你的Columns字段的可能值是动态变化的(不是固定的1、2、3),那上面的静态SQL就没法直接用了,这时候需要写动态SQL来生成对应的列。不过从你给出的例子看,列是固定的,上面两种方法完全够用。
内容的提问来源于stack exchange,提问作者hkn
相关产品推荐
相关产品推荐

