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

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  行转列


相关文章:

  • 理解 WebGPU 中的 navigator.gpu 和 adapter:从浏览器到显卡的旅程
  • 视频编码标准(H.264/AVC、H.265/HEVC、AV1、MPEG-2 和 MPEG-4 Part 2)
  • Python常见面试题的详解6
  • vscode/cursor 写注释时候出现框框解决办法
  • 【UE】快速的搓一个基于贴图的假渲染
  • 【Linux】Ext2文件系统、软硬链接
  • Linux: 调整套接字缓冲区大小相关内核参数
  • verilog程序设计及SystemVerilog验证
  • CondaValueError: Malformed version string ‘~‘: invalid character(s)
  • DeepSeek正重构具身大模型和人形机器人赛道!
  • 使用 Express 写接口
  • SpringCloud整合seata,XA、AT、TCC、SAGA模式
  • 【人工智能】深度学习中的梯度检查:原理详解与Python实现
  • 中电联协议对接互联互通实现充电桩小程序成熟搭建
  • CAS单点登录(第7版)26.集成
  • 20250214 随笔 线程安全 线程不安全
  • 解锁 DeepSeek 超强能力:蓝耘智算平台搭建实战秘籍
  • 跟着李沐老师学习深度学习(八)
  • 详细介绍:使用 XMLHttpRequest 进行数据提交(完成用户注册功能)
  • Docker 部署 Nacos (图文并茂超详细)
  • 重庆城市轨道交通拟听证调价:公布两套票价方案,正征求意见
  • 读懂城市|成都高新区:打造“人尽其才”的“理想之城”
  • 国际博物馆日|在辽宁省博物馆遇见敦煌
  • 广西百色“致富果”:高品质芒果直供香港,带动近五千户增收
  • 美国关税压力下,日本经济一年来首次萎缩
  • 铁路端午假期运输火车票今日开售,12306提升应对超大规模并发访问需求能力