iT邦幫忙

0

MySQL 行轉列問題

  • 分享至 

  • xImage

大家好,我的資料長這樣
https://ithelp.ithome.com.tw/upload/images/20240202/20165271b0PhxgsNAi.png
希望可以處理資料為
https://ithelp.ithome.com.tw/upload/images/20240202/20165271yL7AOpLABs.png

已經有匯入mysql了,本來欄位如果很少可以寫group_concat函数,但現在欄位有200多個,如果直接暴力寫太不符合效率了,想問各位要如何寫呢?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2
海綿寶寶
iT邦大神 1 級 ‧ 2024-02-03 09:05:53
最佳解答

Google這篇得到以下結果
基本上還是列出全部的column header(只是用sql的方式產生sum case when指令)
參考看看可不可用

SET @sql = NULL;
SELECT     
    GROUP_CONCAT(DISTINCT     
    CONCAT(       
       'SUM(CASE WHEN exit_station = "', exit_station , '" THEN population ELSE 0 end) AS ' , '"' , exit_station , '"')   
    ) 
INTO @sql
FROM YourTable;

SET @sql = CONCAT('SELECT enter_station , ', @sql, ' 
                  FROM YourTable
                   GROUP BY enter_station');
 
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
dubyter iT邦新手 5 級 ‧ 2024-02-06 10:14:05 檢舉

成功了,感謝大神,後來發現前面需要擴大字元限制,不然一直失敗,寫在下面提供給大家:
SET SESSION group_concat_max_len = 1000000;
另外,想詢問若要輸出成csv,要怎麼輸出呢?因為@sql算是一個暫存的檔(可能我理解錯誤),所以不確定要如何書寫?

dubyter iT邦新手 5 級 ‧ 2024-02-06 17:50:27 檢舉

因為我現在是寫這樣
SET @csv_export_command = CONCAT(
'SELECT * FROM (', @sql, ') AS result INTO OUTFILE "D:/MYSQL/MySQL_Data/Uploads/output.csv" FIELDS TERMINATED BY "," ENCLOSED BY '"''
);

PREPARE csv_stmt FROM @csv_export_command;
EXECUTE csv_stmt;

DEALLOCATE PREPARE stmt;
DEALLOCATE PREPARE csv_stmt;
但我不太知道如果同時要把欄位名輸出要怎麼改

0

建議使用一些線上產好語法的工具,這樣大神比較快可以處理,他們時間很寶貴。

我先建好給大神回答
資料表建立

dubyter iT邦新手 5 級 ‧ 2024-02-06 10:14:52 檢舉

好的,因為是第一次發問,所以不太知道發文格式,下次會注意的謝謝。

我要發表回答

立即登入回答