Phpmyadmin

將行數據轉置為 MYSQL 中的列

  • April 12, 2022

請幫助我使用文章中給出的可以將 table1 更改為 table2 的腳本。 我希望將行數據更改為列

請幫助我使用文章中給出的可以將 table1 更改為 table2 的腳本。我希望將行數據更改為列

請提供作為文本的數據,您的圖像,用於 ocr 還不夠好

CREATE TABLE table1 (
  `regno` VARCHAR(6),
  `subject` VARCHAR(16),
  `grade` VARCHAR(2)
);

INSERT INTO table1
  (`regno`, `subject`, `grade`)
VALUES
  ('7007gd', 'mathematics', 'C6'),
  ('7007gd', 'english language', 'CS'),
  ('7007gd', 'economics', 'C5'),
  ('7007gd', 'government', '83'),
  ('7007gd', 'biology', 'C6'),
  ('7010gd', 'mathematics', 'C6'),
  ('7010gd', 'english language', 'C5'),
  ('7010gd', 'economics', 'C5'),
  ('7010gd', 'government', 'C5'),
  ('7010gd', 'biology', 'C5'),
  ('70151f', 'mathematics', 'C6'),
  ('70151f', 'english language', 'C5'),
  ('70151f', 'economics', 'C6'),
  ('70151f', 'government', 'C5'),
  ('70151f', 'biology', 'C5'),
  ('70151f', 'chemistry', 'C5'),
  ('70151f', 'physics', '83');
SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
               CONCAT('MAX(IF(`subject` = "', `subject`,'", `grade`,"")) AS "',`subject`,'"')
              ) INTO @sql
FROM table1;


SET @sql = CONCAT('SELECT  `regno`,  ', @sql, ' 
                  FROM table1 s
                 GROUP BY s.`regno`
                 ORDER BY s.`regno`');
#SELECT @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE stmt;
雷尼奧 | 生物學 | 化學 | 經濟學 | 英語| 政府| 數學 | 物理
:----- | :------ | :-------- | :-------- | :--------------- | :--------- | :---------- | :------
7007gd | C6 | | C5 | 電腦科學 | 83 | C6 | 
7010gd | C5 | | C5 | C5 | C5 | C6 | 
70151f | C5 | C5 | C6 | C5 | C5 | C6 | 83 

db<>在這裡擺弄

您正在尋找的是數據透視表。在 MySQL 中並沒有任何快速簡便的方法來做到這一點(據我所知)。

我對 T-SQL 更熟悉,但我會嘗試一下。需要注意的是,我必須將您的成績處理為十進制值(百分比)才能使用該AVG功能。在此範例中,我沒有這樣做,因為您可能有一個要加入的表為您執行此操作。

我引用了 StackOverflow 的這個答案和 codingSight 的這個解決方案

SELECT
     `regno`,
     AVG(IF(`subject` = 'mathematics', `grade`, NULL)) AS `mathematics`,
     AVG(IF(`subject` = 'english language', `grade`, NULL)) AS `english language`,
     AVG(IF(`subject` = 'economics', `grade`, NULL)) AS `economics`,
     AVG(IF(`subject` = 'government', `grade`, NULL)) AS `government`,
     AVG(IF(`subject` = 'biology', `grade`, NULL)) AS `biology`,
     AVG(IF(`subject` = 'chemistry', `grade`, NULL)) AS `chemistry`,
     AVG(IF(`subject` = 'physics', `grade`, NULL)) AS `physics`
FROM results
GROUP BY `regno`;

我希望這有幫助!

編輯:我忽略了只使用MAXorMIN函式(而不是AVG)。如果您沒有同一學生的多個成績,您可以使用以下程式碼:

SELECT
     `regno`,
     MAX(IF(`subject` = 'mathematics', `grade`, NULL)) AS `mathematics`,
     MAX(IF(`subject` = 'english language', `grade`, NULL)) AS `english language`,
     MAX(IF(`subject` = 'economics', `grade`, NULL)) AS `economics`,
     MAX(IF(`subject` = 'government', `grade`, NULL)) AS `government`,
     MAX(IF(`subject` = 'biology', `grade`, NULL)) AS `biology`,
     MAX(IF(`subject` = 'chemistry', `grade`, NULL)) AS `chemistry`,
     MAX(IF(`subject` = 'physics', `grade`, NULL)) AS `physics`
FROM results
GROUP BY `regno`;

引用自:https://dba.stackexchange.com/questions/274960