My SQL 列转行操作

原表结构如下,我们可以发现,“日运输量”和“车次”是在同一张表中相互独立的两个字段,即独立的两列数据,下面,我将系统中的测试数据以及代码全部放出来,以解释列转行的操作方法

 原表数据库查询代码:

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
    年月,发货量类型