Mysql 使用SQL行作为列转换表

Mysql 使用SQL行作为列转换表,mysql,sql,select,Mysql,Sql,Select,我有下表: sample_name gene_name expression_value Father 1 A1BG 1.53462 Q83X 1 A1BG 1.29403 Rescue 1 A1BG 1.81678 Father 2 A1BG 1.56481 Q83X 2 A1BG 0.924723 Rescue 2 A1BG 1.70408 Father 1

我有下表:

sample_name gene_name expression_value 
Father 1    A1BG       1.53462 
Q83X 1      A1BG       1.29403 
Rescue 1    A1BG       1.81678 
Father 2    A1BG       1.56481 
Q83X 2      A1BG       0.924723 
Rescue 2    A1BG       1.70408 
Father 1    A1BG-AS1   1.96224 
O83X 1      A1BG-AS1   1.92807 
Rescue 1    A1BG-AS1   2.0421 
Father 2    A1BG-AS1   1.61606
我想编写一个select查询,生成以下输出:

Gene     Father_1 Father_2 Q83X_1     Q83X_2    Rescue_1   Rescue_2
A1BG     1.53462  1.56481  1.29403    0.924723  1.81678    1.70408
A1BG-AS1 ......     .....   .....      .........  .......    ........
我怎样才能达到这个目标


谢谢

您可以使用以下方法在MySQL中执行透视:

mysql> create table tabx_1(sample_name varchar(200),gene_name varchar(200),expression_value float);
Query OK, 0 rows affected (0.46 sec)

mysql> insert into tabx_1 values
    -> ('Father 1','A1BG','1.53462'), 
    -> ('Q83X 1','A1BG','1.29403'), 
    -> ('Rescue 1','A1BG','1.81678'), 
    -> ('Father 2','A1BG','1.56481'), 
    -> ('Q83X 2','A1BG','0.924723'), 
    -> ('Rescue 2','A1BG','1.70408'), 
    -> ('Father 1','A1BG-AS1','1.96224'), 
    -> ('O83X 1','A1BG-AS1','1.92807'), 
    -> ('Rescue 1','A1BG-AS1','2.0421'), 
    -> ('Father 2','A1BG-AS1','1.61606');
Query OK, 10 rows affected (0.08 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> 
mysql> select gene_name,
    -> sum(case sample_name when 'Father 1' then expression_value end) Father_1,
    -> sum(case sample_name when 'Father 2' then expression_value end) Father_2,
    -> sum(case sample_name when 'Q83X 1' then expression_value end) Q83X_1,
    -> sum(case sample_name when 'Q83X 2' then expression_value end) Q83X_2,
    -> sum(case sample_name when 'Rescue 1' then expression_value end) Rescue_1,
    -> sum(case sample_name when 'Rescue 2' then expression_value end) Rescue_2
    -> from tabx_1
    -> group by gene_name;
+-----------+--------------------+--------------------+-------------------+--------------------+--------------------+--------------------+
| gene_name | Father_1           | Father_2           | Q83X_1            | Q83X_2             | Rescue_1           | Rescue_2           |
+-----------+--------------------+--------------------+-------------------+--------------------+--------------------+--------------------+
| A1BG      | 1.5346200466156006 |  1.564810037612915 | 1.294029951095581 | 0.9247230291366577 | 1.8167799711227417 | 1.7040799856185913 |
| A1BG-AS1  | 1.9622399806976318 | 1.6160600185394287 |              NULL |               NULL |  2.042099952697754 |               NULL |
+-----------+--------------------+--------------------+-------------------+--------------------+--------------------+--------------------+
2 rows in set (0.00 sec)

您可以使用以下方法在MySQL中执行透视:

mysql> create table tabx_1(sample_name varchar(200),gene_name varchar(200),expression_value float);
Query OK, 0 rows affected (0.46 sec)

mysql> insert into tabx_1 values
    -> ('Father 1','A1BG','1.53462'), 
    -> ('Q83X 1','A1BG','1.29403'), 
    -> ('Rescue 1','A1BG','1.81678'), 
    -> ('Father 2','A1BG','1.56481'), 
    -> ('Q83X 2','A1BG','0.924723'), 
    -> ('Rescue 2','A1BG','1.70408'), 
    -> ('Father 1','A1BG-AS1','1.96224'), 
    -> ('O83X 1','A1BG-AS1','1.92807'), 
    -> ('Rescue 1','A1BG-AS1','2.0421'), 
    -> ('Father 2','A1BG-AS1','1.61606');
Query OK, 10 rows affected (0.08 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> 
mysql> select gene_name,
    -> sum(case sample_name when 'Father 1' then expression_value end) Father_1,
    -> sum(case sample_name when 'Father 2' then expression_value end) Father_2,
    -> sum(case sample_name when 'Q83X 1' then expression_value end) Q83X_1,
    -> sum(case sample_name when 'Q83X 2' then expression_value end) Q83X_2,
    -> sum(case sample_name when 'Rescue 1' then expression_value end) Rescue_1,
    -> sum(case sample_name when 'Rescue 2' then expression_value end) Rescue_2
    -> from tabx_1
    -> group by gene_name;
+-----------+--------------------+--------------------+-------------------+--------------------+--------------------+--------------------+
| gene_name | Father_1           | Father_2           | Q83X_1            | Q83X_2             | Rescue_1           | Rescue_2           |
+-----------+--------------------+--------------------+-------------------+--------------------+--------------------+--------------------+
| A1BG      | 1.5346200466156006 |  1.564810037612915 | 1.294029951095581 | 0.9247230291366577 | 1.8167799711227417 | 1.7040799856185913 |
| A1BG-AS1  | 1.9622399806976318 | 1.6160600185394287 |              NULL |               NULL |  2.042099952697754 |               NULL |
+-----------+--------------------+--------------------+-------------------+--------------------+--------------------+--------------------+
2 rows in set (0.00 sec)

谷歌:“MySQL PIVOT”。SQL中的PIVOT:考虑在呈现层/应用层代码中处理数据显示的问题,假设您有这个(例如,一个简单的PHP循环作用于有序数组)。谷歌:“MySQL PIVOT”。SQL中的PIVOT:考虑在表示层/应用层代码中处理数据显示的问题,假设你有这个(例如,一个简单的PHP循环作用于一个有序数组)!真的帮了我的忙!干杯,伙计!真的帮了我的忙!