My SQL 列轉行操作

冬日暖羊發表於2024-09-06

原表結構如下,我們可以發現,“日運輸量”和“車次”是在同一張表中相互獨立的兩個欄位,即獨立的兩列資料,下面,我將系統中的測試資料以及程式碼全部放出來,以解釋列轉行的操作方法

原表資料庫查詢程式碼:

1 SELECT
2     yzrq AS 運作日期,
3     DATE_FORMAT( yzrq, '%Y-%m' ) AS 年月,
4     rysl AS 日運輸量,
5     jldw AS 計量單位,
6     cc AS 車次 
7 FROM
8     uf_ysmxb

原表查詢結果:

目標:車次需要按月進行統計,相當於列轉行

最終需要欄位:年月、月度發貨量、發貨量型別

第一步:我們需要單獨將車次資料提取出來

SELECT
        yzrq,
        DATE_FORMAT( yzrq, '%Y-%m' ) AS 年月,
        cc AS 日運輸量,
        '車次' AS 發貨量型別 
    FROM
        uf_ysmxb 

第二步:使用union all與其他的資料合併(到這裡就已經實現了列轉行的操作),注意,合併的兩張表必須保證欄位型別和名字一致

SELECT
        yzrq AS 運作日期,
        DATE_FORMAT( yzrq, '%Y-%m' ) AS 年月,
        rysl AS 日運輸量,
    CASE
            jldw 
            WHEN 34 THEN
            '重量' ELSE '體積' 
        END AS 發貨量型別 
    FROM
        uf_ysmxb UNION ALL
    SELECT
        yzrq,
        DATE_FORMAT( yzrq, '%Y-%m' ) AS 年月,
        cc AS 日運輸量,
        '車次' AS 發貨量型別 
    FROM
        uf_ysmxb 

第三步:將資料按要求進行彙總統計

SELECT
    年月,
    SUM(日運輸量) AS 月度發貨量,發貨量型別 
FROM
    (
    SELECT
        yzrq AS 運作日期,
        DATE_FORMAT( yzrq, '%Y-%m' ) AS 年月,
        rysl AS 日運輸量,
    CASE
            jldw 
            WHEN 34 THEN
            '重量' ELSE '體積' 
        END AS 發貨量型別 
    FROM
        uf_ysmxb UNION ALL
    SELECT
        yzrq,
        DATE_FORMAT( yzrq, '%Y-%m' ) AS 年月,
        cc AS 日運輸量,
        '車次' AS 發貨量型別 
    FROM
        uf_ysmxb 
    ) AS T 
GROUP BY
    年月,發貨量型別

相關文章