记一次简单的存储过程和Pivot行转列

一次,简单,存储,过程,pivot,转列 · 浏览次数 : 14

小编点评

```sql CREATE PROC FactoryCalendar @MD001 NVARCHAR(50)ASBEGIN DECLARE @Columns AS NVARCHAR(MAX) DECLARE @SQL AS NVARCHAR(MAX) -- 使用动态SQL生成资源名称的列名 SELECT @Columns = STRING_AGG(QUOTENAME(资源名称), ', ') WITHIN GROUP (ORDER BY 资源名称) FROM ( SELECT DISTINCT MB.MB002 AS 资源名称 FROM BW_CMSMD CMD INNER JOIN BW_MPSMB MB ON CMD.MD003 = MB.MB003 INNER JOIN BW_MPSMD MD ON MB.MB001 = MD.MD001 WHERE CMD.MD001 = @MD001 ) AS ColName; print @Columns; -- 构建动态SQL查询 SET @SQL = ' SELECT * FROM ( SELECT MB.MB002 AS 资源名称, CMD.MD001 AS 部门编号, CMD.MD002 AS 部门名称, MD.MD002 AS 日期, MD.MD003 AS 当日产能 FROM BW_CMSMD CMD INNER JOIN BW_MPSMB MB ON CMD.MD003 = MB.MB003 INNER JOIN BW_MPSMD MD ON MB.MB001 = MD.MD001 WHERE CMD.MD001 = ''' + @MD001 + ''' ) AS SourceData PIVOT ( MAX(当日产能) FOR 资源名称 IN (' + @Columns + ') ) AS PivotedData;' -- 执行动态SQL查询 EXEC(@SQL); END ```

正文

首先我很讨厌写存储过程,其次我很讨厌

没办法,主要是需要进行 行转列,项目经理说可以用Pivot。我不是很精通sql,但是我会百度呀~

pivot需要有确定的列名。那我这个项目里面没办法确定,最后问了gpt,使用动态sql(我以前也没用过),不过效果是我想要的,于是乎,改成存储过程吧。

简单的存储过程不难,其实以前我也会写,只是很久很久……似乎我工作之后就没用过,差不多就忘了……

小小总结一下

  1. 创建存储过程  
    CREATE PROC(PROCEDURE ) FactoryCalendar
    //create 创建  
    //proc(procedure是全称,proc就行)存储过程  
    //FactoryCalendar 你的存过过程名字
  2. 可以传参或者不传参
    CREATE PROCEDURE FactoryCalendar
        @MD001 NVARCHAR(50)
    AS
    //定义的变量呢需要加@ 然后加个类型,代表参数类型
    //AS关键字主要在于将参数和存储过程主体分开,as下面你就知道存储过程开始了
  3. 接下来就是你要执行的sql了。一般begin开始end结尾。不多废话了。写个案例就知道了
-- 创建存储过程,获取资源组工作日历
CREATE PROCEDURE FactoryCalendar
    @MD001 NVARCHAR(50)
AS
BEGIN
    DECLARE @Columns AS NVARCHAR(MAX)
    DECLARE @SQL AS NVARCHAR(MAX)

    -- 使用动态SQL生成资源名称的列名
    SELECT @Columns = STRING_AGG(QUOTENAME(资源名称), ', ') WITHIN GROUP (ORDER BY 资源名称)
    FROM (
        SELECT DISTINCT MB.MB002 AS 资源名称
        FROM BW_CMSMD CMD
        INNER JOIN BW_MPSMB MB ON CMD.MD003 = MB.MB003
        INNER JOIN BW_MPSMD MD ON MB.MB001 = MD.MD001
        WHERE CMD.MD001 = @MD001
    ) AS ColName;
    print @Columns;
    -- 构建动态SQL查询
    SET @SQL = '
    SELECT *
    FROM (
        SELECT 
            MB.MB002 AS 资源名称, 
            CMD.MD001 AS 部门编号, 
            CMD.MD002 AS 部门名称, 
            MD.MD002 AS 日期, 
            MD.MD003 AS 当日产能
        FROM BW_CMSMD CMD
        INNER JOIN BW_MPSMB MB ON CMD.MD003 = MB.MB003
        INNER JOIN BW_MPSMD MD ON MB.MB001 = MD.MD001
        WHERE CMD.MD001 = ''' + @MD001 + '''
    ) AS SourceData
    PIVOT (
        MAX(当日产能)
        FOR 资源名称 IN (' + @Columns + ')
    ) AS PivotedData;'

    -- 执行动态SQL查询
    EXEC(@SQL);
END

  4.执行存储过程 :有参数就这么写,没有直接 exec FactoryCalendar 

exec FactoryCalendar   '6875'

 

与记一次简单的存储过程和Pivot行转列相似的内容:

记一次简单的存储过程和Pivot行转列

首先我很讨厌写存储过程,其次我很讨厌 没办法,主要是需要进行 行转列,项目经理说可以用Pivot。我不是很精通sql,但是我会百度呀~ pivot需要有确定的列名。那我这个项目里面没办法确定,最后问了gpt,使用动态sql(我以前也没用过),不过效果是我想要的,于是乎,改成存储过程吧。 简单的存储过

记一次 .NET 某自动化采集软件 崩溃分析

一:背景 1.讲故事 前段时间有位朋友找到我,说他的程序在客户的机器上跑着跑着会出现偶发卡死,然后就崩掉了,但在本地怎么也没复现,dump也抓到了,让我帮忙看下到底怎么回事,其实崩溃类的dump也有简单的,也有非常复杂的,因为大多情况下都是非托管层面出现的各种故障,非常考验对 C, C++, Win

记一次 .NET 某埋线管理系统 崩溃分析

## 一:背景 ### 1. 讲故事 经常有朋友跟我反馈,说看你的文章就像看天书一样,有没有一些简单入手的dump 让我们先找找感觉,哈哈,今天就给大家带来一篇入门级的案例,这里的入门是从 WinDbg 的角度来阐述的,这个问题如果你通过 记日志,分析代码 的方式,可能真的无法解决,不信的话继续往下

记一次 .NET 某电力系统 内存暴涨分析

一:背景 1. 讲故事 前些天有位朋友找到我,说他生产上的程序有内存暴涨情况,让我帮忙看下怎么回事,最简单粗暴的方法就是让朋友在内存暴涨的时候抓一个dump下来,看一看大概就知道咋回事了。 二:Windbg 分析 1. 到底是谁吃了内存 这个问题说的再多也不为过,一定要看清楚这个程序是如何个性化发展

记一次 .NET 某传感器采集系统 线程爆高分析

一:背景 1. 讲故事 前段时间有位朋友微信找到我,说他的程序使用 hsl 库之后,采集 plc 时内存溢出,让我帮忙看一下怎么回事,哈哈,貌似是分析之旅中的第二次和 hsl 打交道,既然找到我,那就上 windbg 说话吧。 二:WinDbg 分析 1. 为什么会内存溢出 简单观察程序的提交内存之

记一次 .NET 某安全生产信息系统 CPU爆高分析

一:背景 1.讲故事 今天是🐏的第四天,头终于不巨疼了,写文章已经没什么问题,赶紧爬起来写。 这个月初有位朋友找到我,说他的程序出现了CPU爆高,让我帮忙看下怎么回事,简单分析了下有两点比较有意思。 这是一个安全生产的信息管理平台,第一次听说,我的格局小了。 这是一个经典的 CPU 爆高问题,过往

[转帖]Redis中的Lua脚本

最近琢磨分布式锁时接触到的知识点,简单记一下。 文章目录 1. Redis中的Lua2. 利用Lua操作Redis3. Lua脚本的原子性4. 关于 EVALSHA5. 常用`SCRIPT` 命令6. 脚本本地化 1. Redis中的Lua Redis支持Lua,代码直接发送完整脚本即可。基本语法(

记一次由于操作失误致使数据库瘫痪的故障分析与解决方案

在这篇文章中,我将分享一次由于操作不当导致数据库瘫痪的经验。通过回顾故障发生的时间、系统简介、时间线、问题分析和经验总结等方面的内容。讨论操作时间不当、操作流程不当、缺乏执行计划和限流机制等问题,并提出一些建议,如确认数据库更新时间、优化更新操作、使用限流工具、设置超时时间和重试机制、调整数据库参数以及定期维护和优化数据库。通过分享这次经验,我希望能帮助他人避免类似的错误,并提高数据库操作的准确性和稳定性。

[转帖]记一次使用gdb诊断gc问题全过程

https://www.cnblogs.com/codelogs/p/17092141.html 简介# 上次解决了GC长耗时问题后,系统果然平稳了许多,这是之前的文章《GC耗时高,原因竟是服务流量小?》然而,过了一段时间,我检查GC日志时,又发现了一个GC问题,如下:从这个图中可以发现,我们GC有

[转帖] 记一次使用gdb诊断gc问题全过程

记一次使用gdb诊断gc问题全过程 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介# 上次解决了GC长耗时问题后,系统果然平稳了许多,这是之前的文章《GC耗时高,原因竟是服务流量小?》然而,过了一段时间,我检查GC日志时,又发现了一个GC问题,如下:从这个图中可