神匠 发表于 2024-9-6 22:04:13

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

来源:https://www.cnblogs.com/ykagile/p/18399903
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: My SQL 列转行操作