将mysql表行转换为列

将mysql表行转换为列,mysql,select,rows,transpose,Mysql,Select,Rows,Transpose,我有以下两个表格: CREATE TABLE asset ( sid int(11) NOT NULL AUTO_INCREMENT, asset_code varchar(32), notes longtext, PRIMARY KEY ('sid'), kEY 'index_asset' ('asset_code'), ) CREATE TABLE asset_data ( asset_code varchar(32) NOT NULL , sid int(10) unsigned

我有以下两个表格:

CREATE TABLE asset (
sid int(11) NOT NULL AUTO_INCREMENT,
asset_code varchar(32),
notes longtext,
PRIMARY KEY ('sid'),
kEY 'index_asset' ('asset_code'),
)

CREATE TABLE asset_data (
  asset_code varchar(32) NOT NULL ,
  sid int(10) unsigned NOT NULL,
  field_name varchar(128) NOT NULL,
  field_value mediumtext NOT NULL,
  PRIMARY KEY (sid,field_name),
  KEY asset_code (asset_code),
  KEY sid_asset_code (sid,asset_code)
)
表中的样本数据如下所示:

INSERT INTO asset(asset_code,notes)
       values('asset001','aaaaaaaa'),
       ('asset002','bbbbbbbb');

INSERT INTO asset_data(asset_code,sid,field_name,field_value)
       values('asset001',1,'location','LL'),
       ('asset001',1,'mass','20kg'),
       ('asset001',1,'date_of_purchase','2005-04-17'),   
       ('asset002',2,'location','CK'),
       ('asset002',2,'mass','190kg'),
       ('asset002',2,'date_of_purchase','2010-04-03');
如何显示此数据,使数据看起来如下所示:

asset_code   sid     location      mass      date_of_purchase
 asset001      1         LL          20kg     2005-04-17
 asset002      2         CK         190kg     2010-04-03

这个过程称为pivot。 这是由GROUP BY与MAX和CASE组合完成的

查询

SELECT
   asset_data.asset_code
 , asset_data.sid
 , MAX(
     CASE
       WHEN asset_data.field_name = 'location'
       THEN asset_data.field_value
      END
   ) AS location
 , MAX(
     CASE
       WHEN asset_data.field_name = 'mass'
       THEN asset_data.field_value
     END
   ) AS mass
 , MAX(
     CASE
       WHEN asset_data.field_name = 'date_of_purchase'
       THEN asset_data.field_value
      END
    ) AS date_of_purchase      
FROM 
 asset_data
GROUP BY
   asset_data.asset_code
 , asset_data.sid
结果

asset_code     sid  location  mass    date_of_purchase  
----------  ------  --------  ------  ------------------
asset001         1  LL        20kg    2005-04-17        
asset002         2  CK        190kg   2010-04-03        

这个过程称为pivot。 这是由GROUP BY与MAX和CASE组合完成的

查询

SELECT
   asset_data.asset_code
 , asset_data.sid
 , MAX(
     CASE
       WHEN asset_data.field_name = 'location'
       THEN asset_data.field_value
      END
   ) AS location
 , MAX(
     CASE
       WHEN asset_data.field_name = 'mass'
       THEN asset_data.field_value
     END
   ) AS mass
 , MAX(
     CASE
       WHEN asset_data.field_name = 'date_of_purchase'
       THEN asset_data.field_value
      END
    ) AS date_of_purchase      
FROM 
 asset_data
GROUP BY
   asset_data.asset_code
 , asset_data.sid
结果

asset_code     sid  location  mass    date_of_purchase  
----------  ------  --------  ------  ------------------
asset001         1  LL        20kg    2005-04-17        
asset002         2  CK        190kg   2010-04-03        

您需要连接asset_数据表两次。No@Roman您需要使用GROUP BY结合MAX和CASE进行透视您需要连接asset_数据表两次。No@Roman您需要使用GROUP BY结合MAX和CASE进行透视