crosstab(text source_sql, text category_sql)
source_sql 需要行转列的原始数据
category_sql 值列
crosstab 函数有个问题就是列数量必须提前定义,不能动态生成,只能后台提前生成然后传给mybatis 作为参数 如下面的columns ,这样可以做到动态行转列,
此语句必须返回一个rowid列,一个 类别列和一个 值列。它也可能有一个或多个“额外”列。在 rowid列必须是第一个。该类别和值字段必须是最后两列,按照这个顺序。row_name和category之间的任何列都被视为“extra”。该“额外”列预计将具有相同的所有行相同ROW_NAME 值。
SELECT
*
FROM
crosstab (
'<include refid="source_sql"/>',
'<include refid="category_sql"/>'
) AS T (
${columns}
)
) AS crossval
</select>
后台代码拼成 ${columns} 内容
列1 int8,
列2 VARCHAR,
列3 VARCHAR,
列4 VARCHAR
category_sql 如下:
select id from emp GROUP BY id,name order by 1
source_sql 如下:
SELECT
item_id as rowid,
emp_id as category ,
score as values
FROM
emp_score
注意
1这里 emp表的id 是 emp_score 表的category对应,source_sql 顺序就是 第一个是列名,第二个是和category_sql 对应的字段,第三个是value,顺序是固定的
2.如果在source_sql 里面加条件查询,需要单引号转义,
<if test="begin != null">
AND create_time >=`''#{begin}''`
</if>