2017-09-09 5 views
0

に私は次の2つの表があります。テーブルのターンMySQLのテーブルの行列

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 
+0

でGROUP BYで行われます。 – Roman

+0

@Romanでは、MAXとCASEと組み合わせてGROUP BYでピボットする必要がありません –

答えて

2

このプロセスはピボットと呼ばれます。 これは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_dataテーブルに参加する必要があり

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