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

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_33721427/article/details/89781701?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行转列功能最佳实战.

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值