行列转换(一)

行列转换(一)

情景一

        +----+--------+---------+
        | id | month  | pay_fee |
        +----+--------+---------+
        |  1 | 201801 |      10 |
        |  2 | 201802 |      11 |
        |  3 | 201803 |      54 |
        |  4 | 201804 |      32 |
        +----+--------+---------+  
                    |
                    V
+--------+--------+--------+--------+
| 201801 | 201802 | 201803 | 201804 |
+--------+--------+--------+--------+
|     10 |     11 |     54 |     32 |
+--------+--------+--------+--------+

sql实现:

SELECT
        max(CASE  WHEN month='201801' THEN pay_fee ELSE 0 end) '201801',
        max(CASE  WHEN month='201802' THEN pay_fee ELSE 0 end) '201802',
        max(CASE  WHEN month='201803' THEN pay_fee ELSE 0 end) '201803',
        max(CASE  WHEN month='201804' THEN pay_fee ELSE 0 end) '201804'
FROM
    t_month

或

SELECT
        sum(CASE  WHEN month='201801' THEN pay_fee ELSE 0 end) '201801',
        sum(CASE  WHEN month='201802' THEN pay_fee ELSE 0 end) '201802',
        sum(CASE  WHEN month='201803' THEN pay_fee ELSE 0 end) '201803',
        sum(CASE  WHEN month='201804' THEN pay_fee ELSE 0 end) '201804'
FROM
    t_month

情景二

mysql> select * from t_month;
+----+--------+---------+-----------+   
| id | month  | pay_fee | total_fee |
+----+--------+---------+-----------+
|  1 | 201801 |      10 |        20 |
|  2 | 201802 |      11 |        23 |
|  3 | 201803 |      54 |      2334 |
|  4 | 201804 |      32 |         6 |
+----+--------+---------+-----------+
                |
                V
+--------+--------+--------+--------+
| 201801 | 201802 | 201803 | 201804 |
+--------+--------+--------+--------+
|     10 |     11 |     54 |     32 |  //pay_ee
|     20 |     23 |   2334 |      6 |  //total_fee
+--------+--------+--------+--------+

sql实现:

(
    SELECT
        max(CASE  WHEN month='201801' THEN pay_fee ELSE 0 end) '201801',
        max(CASE  WHEN month='201802' THEN pay_fee ELSE 0 end) '201802',
        max(CASE  WHEN month='201803' THEN pay_fee ELSE 0 end) '201803',
        max(CASE  WHEN month='201804' THEN pay_fee ELSE 0 end) '201804'
    FROM
        t_month
)
UNION
(
    SELECT
        max(CASE  WHEN month='201801' THEN total_fee ELSE 0 end) '201801',
        max(CASE  WHEN month='201802' THEN total_fee ELSE 0 end) '201802',
        max(CASE  WHEN month='201803' THEN total_fee ELSE 0 end) '201803',
        max(CASE  WHEN month='201804' THEN total_fee ELSE 0 end) '201804'
    FROM
        t_month
)

script

CREATE TABLE `t_month` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `month` varchar(255) DEFAULT NULL,
  `pay_fee` int(11) DEFAULT NULL,
  `total_fee` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;


//插入
INSERT INTO t_month (`id`, `month`, `pay_fee`, `total_fee`)
 VALUES
('1', '201801', '10', '20'),
('2', '201802', '11', '23'),
('3', '201803', '54', '2334'),
('4', '201804', '32', '6');

猜你喜欢

转载自blog.csdn.net/u013887008/article/details/80446397