当前位置: 首页 > article >正文

sql sqlserver的特殊函数COALESCE和PIVOT的用法分析

一、COALESCE是一个返回参数中第一个非NULL值的函数,

列如:COALESCE(a,b,c,d,e);可以按照顺序取abcde,中的第一个非空数据,abcde可以是表达式

用case when 加ISNULL也可以实现,但是写法复杂了
    

     --根据部件id获取产品型号的板材指定类型,1-获取客户的板材指定方式是真指定就是真指定,
     --2-获取不可替代本厂编号是否是不可替代,是就是真指定
     --3-获取MI上的客户是否指定板材,是就是加指定,否则就是不指定
select  temp1.ProductPartId,
max(CASE WHEN temp1.BoardType='真指定' THEN '真指定' else null end) as pnBoardType
,max(CASE WHEN temp1.ProductNumber1 is not null THEN '真指定' else null end) as pnBoardType2
,max(CASE WHEN temp3.bckhyq ='是' THEN '假指定' else '不指定' end )as pnBoardType3

,COALESCE(CASE WHEN temp1.BoardType='真指定' THEN '真指定' else null end, CASE WHEN temp1.ProductNumber1 is not null THEN '真指定' else null end, CASE WHEN temp3.bckhyq ='是' THEN '假指定' else '不指定' end) AS pnBoardTypetemp 
 
INTO    #temp44
from  #temp11 temp1
LEFT JOIN #temp33 temp3 on temp3.ProductPartId=temp1.ProductPartId

GROUP BY temp1.ProductPartId,COALESCE(CASE WHEN temp1.BoardType='真指定' THEN '真指定' else null end, CASE WHEN temp1.ProductNumber1 is not null THEN '真指定' else null end, CASE WHEN temp3.bckhyq ='是' THEN '假指定' else '不指定' end);

二、PIVOT函数,用于行转列

SELECT [非旋转列], [旋转后的列1], [旋转后的列2], ...
FROM 
    (SELECT [原始数据列] FROM 表) AS 数据源
PIVOT 
(
    [聚合函数](被聚合列)
    FOR [旋转列] IN ([列值1], [列值2], ...)
) AS 别名
  1. 非旋转列:结果中保持为行的列(如产品类别、年份等)。

  2. 旋转列:需要从行值转换为列名的列(如月份、状态等)。

  3. 被聚合列:需要统计的数值列(如销售额、数量等)。

  4. 聚合函数:如 SUMAVGCOUNT 等。

SELECT top 10 t.ProductPartId
        ,t.bcjclx
        ,t.BCXH
        ,t.bckhyq from  (
SELECT p.ProductPartId, eo.ParamCode, p.ParamValue
         FROM SL_pe_Schema.MakeProductPart(NOLOCK)part
              JOIN SL_pe_Schema.MakeProcedureParam(NOLOCK)p ON p.ProductPartId=part.ProductPartId
              JOIN SL_pe_Schema.BaseEngineersParam(NOLOCK)eo ON eo.EngineersParamId=p.EngineersParamId
         WHERE eo.ParamCode IN ('bckhyq','bcjclx','dlcc','PPQTY','bcgys','yhhd', 'sfht', 'bh', 'wulu', 'tgvalue', 'jcth', 'lvhao', 'lvhou', 'drxs', 'JZCH','BCXH','tblx')
            ) tmp     
                PIVOT(min(tmp.ParamValue)
                FOR tmp.ParamCode  IN(bckhyq,bcjclx,dlcc,PPQTY,bcgys,yhhd, sfht, bh, wulu, tgvalue, jcth, JZCH,BCXH,tblx,lvhou,lvhao,drxs)
                ) t 

将原始数据行专列

当然平常的数据库可能没有这个函数,还是有通用方法的,那就是CASE WHEN,只要参数名是固定已知的,就可以用CASE WHEN加聚合函数进行 group by  行转列



http://www.kler.cn/a/547828.html

相关文章:

  • Jenkins+maven+gitlab+shell 实现项目自动化部署
  • Sentinel 源码深度解析
  • resultType,jdbcType,parameterType区别
  • 大数据学习(46) - Flink按键分区处理函数
  • Java版PDF拼接
  • 结合实际讲NR系列5——RRCResume
  • 分享一个使用的音频裁剪chrome扩展-Ringtone Maker
  • 【css实现边框圆角渐变效果】
  • 服务器安全——日志分析和扫描
  • 力扣19题——删除链表的倒数第 N 个结点
  • 股票自动化交易
  • 【20250215】二叉树:144.二叉树的前序遍历
  • Python网络编程
  • 无人机航迹规划: 梦境优化算法(Dream Optimization Algorithm,DOA)求解无人机路径规划MATLAB
  • python学opencv|读取图像(七十)使用cv2.HoughCircles()函数实现图像中的霍夫圆形检测
  • MES管理系统解决方案在制造企业中的实施路径
  • mybatis-lombok工具包介绍
  • 阿里云视频点播,基于thinkphp8上传视频
  • 游戏引擎学习第101天
  • 登录演示和功能拆解