MySQL 行列转换

最近在慕课上 看MySQL教程 里面关于行转列的教程不错 贴上练习SQL 做个记录
简单行转列

SELECT
    a.user_name,
    sum(b.kills)
FROM
    user1 a
JOIN user_kills b ON a.id = b.user_id
GROUP BY
    user_name;

CROSS JOIN 行列转换

select * from (
    SELECT
        sum(kills) AS '孙悟空'
    FROM
        user1 a
    JOIN user_kills b ON a.id = b.user_id
    AND a.user_name = '孙悟空'
) a
CROSS JOIN (
    SELECT
        sum(kills) AS '沙甥'
    FROM
        user1 a
    JOIN user_kills b ON a.id = b.user_id
    AND a.user_name = '沙甥'
) b
CROSS JOIN (
    SELECT
        sum(kills) AS '猪八戒'
    FROM
        user1 a
    JOIN user_kills b ON a.id = b.user_id
    AND a.user_name = '猪八戒'
) c;
case行列转换
SELECT
    sum(
        CASE
        WHEN user_name = '孙悟空' THEN
            kills
        END
    ) AS '孙悟空',
    sum(
        CASE
        WHEN user_name = '沙甥' THEN
            kills
        END
    ) AS '沙甥',
    sum(
        CASE
        WHEN user_name = '猪八戒' THEN
            kills
        END
    ) AS '猪八戒'
FROM
    user1 a
JOIN user_kills b ON a.id = b.user_id;

单列转多行

SELECT
    user_name,
    REPLACE (
        substring(
            substring_index(mobile, ',', a.id),
            CHAR_LENGTH(
                SUBSTRING_INDEX(mobile, ',', a.id - 1)
            ) + 1
        ),
        ',',
        ''
    ) AS mobile
FROM
    tb_sequence a
CROSS JOIN (
    SELECT
        user_name,
        CONCAT(mobile, ',') AS mobile,
        LENGTH(mobile) - LENGTH(REPLACE(mobile, ',', '')) + 1 size
    FROM
        user1 b
) b ON a.id <= b.size;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值