mysql行转列、列转行

建表语句

DROP TABLE IF EXISTS `ff`;
CREATE TABLE `ff` (
  `year` int(255) DEFAULT NULL,
  `month` int(255) DEFAULT NULL,
  `amount` float(255,1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `ff` VALUES ('1991', '1', '1.1');
INSERT INTO `ff` VALUES ('1991', '2', '1.2');
INSERT INTO `ff` VALUES ('1991', '3', '1.3');
INSERT INTO `ff` VALUES ('1991', '4', '1.4');
INSERT INTO `ff` VALUES ('1992', '1', '2.1');
INSERT INTO `ff` VALUES ('1992', '2', '2.2');
INSERT INTO `ff` VALUES ('1992', '3', '2.3');
INSERT INTO `ff` VALUES ('1992', '4', '2.4');

行转列

利用max函数实现行转列

行转列结果

SELECT
    `year`,
    MAX(
        CASE `month`
        WHEN 1 THEN
            amount
        ELSE
            0
        END
    ) AS 'm1',
    MAX(
        CASE `month`
        WHEN 2 THEN
            amount
        ELSE
            0
        END
    ) AS 'm2',
    MAX(
        CASE `month`
        WHEN 3 THEN
            amount
        ELSE
            0
        END
    ) AS 'm3',
    MAX(
        CASE `month`
        WHEN 4 THEN
            amount
        ELSE
            0
        END
    ) AS 'm4'
FROM
    ff
GROUP BY
    `year` 

列转行

使用union 来实现列转行
这里我偷懒了,将行转列的结果作为视图,没有重新建表,效果是一样的。

列转行结果

SELECT * FROM(SELECT
    `year`,
    1 AS 'month',
    `m1` AS amount
FROM
    ffe
UNION
    SELECT
        `year`,
        2 AS 'month',
        `m2` AS amount
    FROM
        ffe
    UNION
        SELECT
            `year`,
            3 AS 'month',
            `m3` AS amount
        FROM
            ffe
        UNION
            SELECT
                `year`,
                4 AS 'month',
                `m4` AS amount
            FROM
                ffe) AS wws
ORDER BY `year`,`month` ASC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值