行列转换(二)

行列转换(二)

情景一

1.有限列类型:

+----+----------+-------+--------+
| id | fruit_id | color | weight |
+----+----------+-------+--------+
|  1 |        1 | 红    |     23 |
|  2 |        1 | 黑    |     54 |
|  3 |        2 | 红    |     12 |
|  4 |        2 | 黑    |     43 |
|  5 |        3 | 黑    |     90 |
+----+----------+-------+--------+
                |
                V

      +----------+----+----+
      | fruit_id | 红 | 黑 |
      +----------+----+----+
      |        1 | 23 | 54 |
      |        2 | 12 | 43 |
      |        3 |  0 | 90 |
      +----------+----+----+

sql实现:

SELECT
   fruit_id,
     max(case WHEN color='红' THEN weight ELSE 0 END) '红',
     max(CASE WHEN color='黑' THEN weight ELSE 0 END) '黑'
FROM
t_fruit
GROUP BY fruit_id

2.无限列类型,使用动态sql(或者存储过程):

set @sql='';

SELECT
    @sql:= concat(
        @sql,
        'sum(case color when \'',color, '\' then  weight else 0 end) as \'', color,
        '\','
    )
FROM
(
SELECT DISTINCT
    color
FROM
    t_fruit
)temp;


set @sql=concat(
    'SELECT fruit_id,',
    LEFT(@sql, CHAR_LENGTH(@sql)-1),
    -- LEFT(@sql, LENGTH(@sql)-1), 如果含有中文字符就不行...
   ' from t_fruit group by fruit_id'
);

-- SELECT @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;

script

CREATE TABLE `t_fruit` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fruit_id` int(11) DEFAULT NULL,
  `color` varchar(255) DEFAULT NULL,
  `weight` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

//插入
INSERT INTO `dbl`.`t_fruit` (`id`, `fruit_id`, `color`, `weight`)
 VALUES
('1', '1', '红', '23'),
('2', '1', '黑', '54'),
('3', '2', '红', '12'),
('4', '2', '黑', '43'),
('5', '3', '黑', '90');

情景二

列转行:

+----+----------+-------------+-----------+
| id | fruit_id | color_black | color_red |
+----+----------+-------------+-----------+
|  1 |        1 | 54          | 23        |
|  2 |        2 | 43          | 12        |
|  3 |        3 | 90          | 0         |
+----+----------+-------------+-----------+
                  |
                  V
    +----------+-------+-----------+
    | fruit_id | color | weight    |
    +----------+-------+-----------+
    |        1 | 红    | 23        |
    |        1 | 黑    | 54        |
    |        2 | 红    | 12        |
    |        2 | 黑    | 43        |
    |        3 | 红    | 0         |
    |        3 | 黑    | 90        |
    +----------+-------+-----------+

sql实现:

SELECT
    fruit_id,
    '红' color,
    color_red weight 
FROM
    t_color_fruit
UNION ALL
    SELECT
        fruit_id,
        '黑' color,
        color_black weight 
    FROM
        t_color_fruit
ORDER BY
    fruit_id,
    color

script


CREATE TABLE `t_color_fruit` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fruit_id` int(11) DEFAULT NULL,
  `color_black` varchar(255) DEFAULT NULL,
  `color_red` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

//插入
INSERT INTO `dbl`.`t_color_fruit` (`id`, `fruit_id`, `color_black`, `color_red`)
VALUES
('1', '1', '54', '23'),
('2', '2', '43', '12'),
('3', '3', '90', '0');

猜你喜欢

转载自blog.csdn.net/u013887008/article/details/80475110
今日推荐