2016-08-29 1 views
1

私は以下の結果テーブルをMySQLに持っています。MySQLマルチローテーブルからユニークローテーブルへのピボット

UPN English Current English Target Maths Current Maths Target Art Current Art Target History Current History Target 
1  6     5     7    7    6    6    NULL    NULL 
2  5     5     7    6    NULL   NULL   5     6 

ことに注意してください:

UPN  Collection  Subject  Grade 
1   Target   English  5 
1   Current   English  6 
1   Target   Maths   7 
1   Current   Maths   7 
1   Target   Art   6 
1   Current   Art   6 
2   Target   English  5 
2   Current   English  5 
2   Target   Maths   6 
2   Current   Maths   7 
2   Target   History  6 
2   Current   History  5 

は以下の表を周りに旋回する必要があります私は下表ようUPNあたりの行に件名のグレードごとのUPNあたりの行から周りにこれをピボットしたいと思います2番目のテーブルでUPN行が一意になる必要があります。したがって、NULLを含む重複するUPN行はありません。

また、UPNに学生がいない場合、セルの値はNULLにする必要があります。

SQL Fiddle

+1

に表示されますか?私は本物のフィドルを共有してください – 1000111

+0

私は本質的に列のトップを横切ってブロードシートビューに値の行の長いリストを再配置しようとしています。 – Matt

+0

@ 1000111 SQL Fiddleを追加しました。もっと役に立つと思っています。 – Matt

答えて

1

私はこれがあなたの問題を解決すると思いクエリ

SELECT t1.UPN, 
IFNULL((SELECT MAX(t2.Grade) FROM `results` AS t2 WHERE t2.UPN = t1.UPN AND t2.`Collection` = 'Current' AND t2.`Subject` = 'English'),NULL) AS 'English Current', 
IFNULL((SELECT MAX(t2.Grade) FROM `results` AS t2 WHERE t2.UPN = t1.UPN AND t2.`Collection` = 'Target' AND t2.`Subject` = 'English'),NULL) AS 'English Target', 
IFNULL((SELECT MAX(t2.Grade) FROM `results` AS t2 WHERE t2.UPN = t1.UPN AND t2.`Collection` = 'Current' AND t2.`Subject` = 'Maths'),NULL) AS 'Maths Current', 
IFNULL((SELECT MAX(t2.Grade) FROM `results` AS t2 WHERE t2.UPN = t1.UPN AND t2.`Collection` = 'Target' AND t2.`Subject` = 'Maths'),NULL) AS 'Maths Target', 
IFNULL((SELECT MAX(t2.Grade) FROM `results` AS t2 WHERE t2.UPN = t1.UPN AND t2.`Collection` = 'Current' AND t2.`Subject` = 'Art'),NULL) AS 'Art Current', 
IFNULL((SELECT MAX(t2.Grade) FROM `results` AS t2 WHERE t2.UPN = t1.UPN AND t2.`Collection` = 'Target' AND t2.`Subject` = 'Art'),NULL) AS 'Art Target', 
IFNULL((SELECT MAX(t2.Grade) FROM `results` AS t2 WHERE t2.UPN = t1.UPN AND t2.`Collection` = 'Current' AND t2.`Subject` = 'History'),NULL) AS 'History Current', 
IFNULL((SELECT MAX(t2.Grade) FROM `results` AS t2 WHERE t2.UPN = t1.UPN AND t2.`Collection` = 'Target' AND t2.`Subject` = 'History'),NULL) AS 'History Target' 
FROM `results` AS t1 GROUP BY t1.`UPN` 
+1

はいこれはありがとう! – Matt

1

これは典型的なpviotテーブルの問題があります。下記のクエリを確認してください:

SET @sql := ''; 

SELECT 
CONCAT('SELECT upn, ', 
GROUP_CONCAT(t.sql_code), 
' FROM results GROUP BY upn;' 
) INTO @sql 
FROM 
(
SELECT 
GROUP_CONCAT('MAX(CASE WHEN Collection =\'', Collection ,'\' AND Subject =\'', Subject ,'\' THEN Grade END) AS \'',CONCAT(Collection,' ',Subject),'\'') AS sql_code 
FROM results 
GROUP BY Collection,Subject 
) AS t; 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE stmt; 
1

@Mattの下に試してみてください。

あなたは、あなたがそれを達成しようとしなかったSQL Fiddle

SELECT tb.UPN,(SELECT MAX(tb1.Grade) FROM `results` AS tb1 WHERE tb1.UPN = tb.UPN AND tb1.`Collection` = 'Current' AND tb1.`Subject` = 'English') AS 'English Current',(SELECT MAX(tb1.Grade) FROM `results` AS tb1 WHERE tb1.UPN = tb.UPN AND tb1.`Collection` = 'Target' AND tb1.`Subject` = 'English') AS 'English Target', 
(SELECT MAX(tb1.Grade) FROM `results` AS tb1 WHERE tb1.UPN = tb.UPN AND tb1.`Collection` = 'Current' AND tb1.`Subject` = 'Maths') AS 'Maths Current', 
(SELECT MAX(tb1.Grade) FROM `results` AS tb1 WHERE tb1.UPN = tb.UPN AND tb1.`Collection` = 'Target' AND tb1.`Subject` = 'Maths') AS 'Maths Target', 
(SELECT MAX(tb1.Grade) FROM `results` AS tb1 WHERE tb1.UPN = tb.UPN AND tb1.`Collection` = 'Current' AND tb1.`Subject` = 'Art') AS 'Art Current', 
(SELECT MAX(tb1.Grade) FROM `results` AS tb1 WHERE tb1.UPN = tb.UPN AND tb1.`Collection` = 'Target' AND tb1.`Subject` = 'Art') AS 'Art Target', 
(SELECT MAX(tb1.Grade) FROM `results` AS tb1 WHERE tb1.UPN = tb.UPN AND tb1.`Collection` = 'Current' AND tb1.`Subject` = 'History') AS 'History Current', 
(SELECT MAX(tb1.Grade) FROM `results` AS tb1 WHERE tb1.UPN = tb.UPN AND tb1.`Collection` = 'Target' AND tb1.`Subject` = 'History') AS 'History Target' 
FROM `results` AS tb GROUP BY tb.`UPN`