mysql使用笔记(一)静态实现POVIT() 行转列

mysql使用笔记(一)静态实现POVIT() 行转列mysql 静态实现 sqlserverPIV 函数写 Sql 语句的时候没经常会遇到将查询结果行转列 列转行的需求在 SqlServer200 中我们有了 PIVOT UNPIVOT 函数可以快速实现行转列和列转行的操作 1 sqlserver 中的 PIVOT 函数 1 1 函数参数与说明 PIVOT 聚合函数 聚合列值 FOR 行转列前的列名 IN 行转列后的列名 1 行转列后的列名 2 行转列后的列名 3 行转列后的列名 N 聚合函数

mysql静态实现sqlserver PIVOT()函数

写Sql语句的时候没经常会遇到将查询结果行转列,列转行的需求在 SqlServer2005中我们有了PIVOT/UNPIVOT函数可以快速实现行转列和列转行的操作。

1. sqlserver中的PIVOT()函数

1.1函数参数与说明:
PIVOT(<聚合函数>([聚合列值]) FOR [行转列前的列名] IN([行转列后的列名1],[行转列后的列名2],[行转列后的列名3],.......[行转列后的列名N])) 

(1)
<聚合函数>
: 就是我们使用的SUM,COUNT,AVG等Sql聚合函数,也就是行转列后计算列的聚合方式;
(2) [聚合列值]: 要进行聚合的列名;
(3) [行转列前的列名]: 这个就是需要将行转换为列的列名;
(4) [行转列后的列名]: 这里需要声明将行的值转换为列后的列名,因为转换后的列名其实就是转换前行的值,所以上面格式中的[行转列后的列名1],[行转列后的列名2],[行转列后的列名3],......[行转列后的列名N]其实就是[行转列前的列名]每一行的值;






1.2 sqlserver初始需求这里需要统计每个车间POPriority个数分别以0到5六种情况

得益于这篇大兄弟的文章:https://blog.csdn.net/weixin_/article/details/?utm_medium=distribute.pc_relevant.none-task-blog-title-11&spm=1001.2101.3001.4242

2.mysql实现上述功能

2.1 通过子查询与case when判断实现
SELECT plant_id,workshop,date_ ,count(c0) as count0 ,count(c1) as count1 ,count(c2) as count2 ,count(c3) as count3 ,count(c4) as count4 ,count(c5) as count5 from ( select a.plant_id ,a.workshop ,a.date_ ,case when a.priority_sort = 0 then a.priority_sort end c0 ,case when a.priority_sort = 1 then a.priority_sort end c1 ,case when a.priority_sort = 2 then a.priority_sort end c2 ,case when a.priority_sort = 3 then a.priority_sort end c3 ,case when a.priority_sort = 4 then a.priority_sort end c4 ,case when a.priority_sort = 5 then a.priority_sort end c5 from (SELECT plant_id,workshop ,NOW() as date_ ,IFNULL(po_priority_sort, 0) AS priority_sort FROM pdm_production_order) a ) b group by workshop,plant_id 
2.2 通过IF聚合函数实现
SELECT plant_id ,workshop ,date_ ,COUNT(IF(a.priority_sort = 0 , a.priority_sort, null )) AS 'count0' ,COUNT(IF(a.priority_sort = 1, a.priority_sort, null )) AS 'count1' ,COUNT(IF(a.priority_sort = 2 , a.priority_sort, null )) AS 'count2' ,COUNT(IF(a.priority_sort = 3 , a.priority_sort, null )) AS 'count3' ,COUNT(IF(a.priority_sort = 4 , a.priority_sort, null )) AS 'count4' ,COUNT(IF(a.priority_sort = 5, a.priority_sort, null )) AS 'count5' FROM ( SELECT plant_id ,workshop ,NOW() as date_ ,IFNULL(po_priority_sort, 0) AS priority_sort FROM pdm_production_order) a group by workshop,plant_id 

查询结果

在这里插入图片描述

3. 附:NOW()与SYSDATE()异同

mysql中日期函数主要是NOW()SYSDATE()两种;NOW()取的是语句开始执行的时间SYSDATE()取的是动态的实时时间

NOW()取自mysql的一个变量”TIMESTAMP”,而这个变量在语句开始执行的时候就设定好,因此在整个语句执行过程中都不会变化。

执行下面这个例子就明白了:

SELECT NOW(),SYSDATE(),SLEEP(3),NOW(),SYSDATE() 

先查询了NOW()SYSDATE(),然后sleep了3秒,再查询NOW()SYSDATE(),结果如下:
在这里插入图片描述
NOW()还有3个同义词,效果跟NOW()一样,而且都有2种形式写法:
LOCALTIMELOCALTIME()
LOCALTIMESTAMPLOCALTIMESTAMP()
CURRENT_TIMESTAMPCURRENT_TIMESTAMP()










参考文章链接: MySQL DML操作——–实现pivot行转列功能最佳实战.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214306.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午4:34
下一篇 2026年3月18日 下午4:35


相关推荐

  • request.getRealPath_java response

    request.getRealPath_java responseequest.getRealPath()这个方法已经不推荐使用了,代替方法是:request.getSession().getServletContext().getRealPath()从Request对象中可以获取各种路径信息,以下例子:假设请求的页面是index.jsp,项目是WebDemo,则在index.jsp中获取有关request对象的各种路径信息如下Stringpath=requ…

    2026年1月25日
    5
  • int与long long之间的转换

    int与long long之间的转换今天看了下c++primer,才知道假如a为longlong或者double类型,b为int类型,假如有表达式a>=b,则编译器会将b先转化为longlong或者double类型,也就是说会将窄类型自动转化为宽类型,这一步是自动转化的,没有必要在代码中再强制转化。但是有个特例,假如a=INT32_MIN,则-a会越界,其数值在我的平台上为-2147483648,如果要得到

    2022年5月3日
    165
  • canda 常用命令

    canda 常用命令1 获取版本 conda Vcondaversio 获取帮助 conda hcondahelp 查看某一命令的帮助 condainstall hcondainstal hcondaremove 3 环境管理 1 列出当前所有环境 conda

    2026年3月18日
    1
  • 谷歌 Nano Banana 2.0 Pro 国内免费用!Zion 一键调用,无限薅羊毛教程来了

    谷歌 Nano Banana 2.0 Pro 国内免费用!Zion 一键调用,无限薅羊毛教程来了

    2026年3月15日
    2
  • sql server 字符串转成日期格式_sql datetime转字符串

    sql server 字符串转成日期格式_sql datetime转字符串一、sqlserver日期时间函数SqlServer中的日期与时间函数1.当前系统日期、时间selectgetdate()2.dateadd在向指定日期加上一段时间的基础上,返回新的datetime值例如:向日期加上2天selectdateadd(day,2,’2004-10-15′)–返回:2004-10-17

    2022年10月8日
    4
  • 编码 ansi_ansi编码和utf-8

    编码 ansi_ansi编码和utf-81、ANSI编码不是一个具体的字符集,而是对一些多字节字符集类型的字符集的一个总体的称呼,总称。(Windows)ANSI编码中的每一个代码页值就是对一个具体的多字节字符集类型的字符集的别名。例如,代码页936就是Windows系统对简体中文GBK这个字符集的别名。如果ANSI编码是一个具体的字符集,由于汉字和韩文字符都是它能表示的字符,那么里面写有韩文字符的以(Windo

    2025年11月12日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号