mybatis+postgresql crosstab 函数动态行转列

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>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值