2016-06-23 6 views
2

私はデータを持っています。MySQLピボットデータ

A, STATUS, P 
    A1, 1,  P1 
    A1, 1,  P2 
    A1, 1,  P3 
    A2, 1,  P3 
    A2, 1,  P4 
    A2, 1,  P5 
    A3, 0,  NULL 

私は、mysqlのクエリでそれを行うことができますどのように同じ

P, A1, A2, A3 
    P1, 1, 0, 0 
    P2, 1, 0, 0 
    P3, 1, 1, 0 
    P4, 0, 1, 0 
    P5, 0, 1, 0 

を引き起こすたいですか?

+0

'A'値がでているどのように多くの異なります あなたの場合? – 1000111

+0

値は動的値です。行ごとに移動するときは自動的に区別されます。 –

答えて

2

あなたが潜在的な列の最大数を知っていると仮定すると、あなたがconditional aggregationを使用して、結果を旋回することができる。

select p, 
     max(case when a = 'A1' then status else 0 end) a1, 
     max(case when a = 'A2' then status else 0 end) a2, 
     max(case when a = 'A3' then status else 0 end) a3 
from yourtable 
group by p 

あなたが潜在的な列の数がわからない場合は、代わりにdynamic sqlを使用する必要があります。

3

これを試してみてください;)

select 
    `P`, 
    max(if(`A` = 'A1', `STATUS`, 0)) as `A1`, 
    max(if(`A` = 'A2', `STATUS`, 0)) as `A2`, 
    max(if(`A` = 'A3', `STATUS`, 0)) as `A3` 
from table1 
where `P` IS NOT NULL 
group by `P` 

DEMO HERE

編集:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'MAX(IF(`A` = ''', 
     `A`, 
     ''', `STATUS`, 0)) AS ', 
     `A` 
    ) 
) INTO @sql 
FROM table1; 
SET @sql = CONCAT('SELECT `P`, ', @sql, ' FROM table1 WHERE `P` IS NOT NULL GROUP BY `P`'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 

DEMO HERE

+0

A1、A2、A3は動的値です –

+0

@ChauApple動的値の場合は、編集した回答を確認してください。 – Blank

+0

ありがとう!それは右に走る –

関連する問題