zoukankan      html  css  js  c++  java
  • 动态行转列问题。需要自提,改吧改吧就行了

    /*******************************************
    **过程名:[show_mftf]
    **输入参数:参数A
    **@JLNO:记录号
    **输出:
    **功能描述:动态列转行
    **作者:
    **更新:修改人xxx;修改日期xxxx
    **版本:
    ********************************************/
    alter proc [dbo].[show_mftf]
    as
    begin
    DECLARE @sql_str NVARCHAR(MAX)
    DECLARE @sql_col NVARCHAR(MAX)
    DECLARE @tableName SYSNAME --行转列表
    DECLARE @groupColumn SYSNAME --分组字段
    DECLARE @row2column SYSNAME --行变列的字段
    DECLARE @row2columnValue SYSNAME --行变列值的字段
    SET @tableName = 'MC_TF_JXYDJY'
    SET @groupColumn = '记录号'
    SET @row2column = 'PROJECT'
    SET @row2columnValue = 'NUM'
    declare @recordNo varchar(30)
    set @recordNo='JL20181029008'
    
    
    --从行数据中获取可能存在的列
    SET @sql_str = N'
    SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['+@row2column+']) 
        FROM ['+@tableName+'] GROUP BY ['+@row2column+']'
    --PRINT @sql_str
    EXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@sql_col_out=@sql_col OUTPUT
    --PRINT @sql_col
    
    SET @sql_str = N'
    SELECT pvt.* FROM (
        SELECT ['+@groupColumn+'],['+@row2column+'],['+@row2columnValue+'] FROM ['+@tableName+']) p PIVOT  
        (SUM(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+ @sql_col +') ) AS pvt 
        where 记录号='''+@recordNo+''''
    PRINT (@sql_str)
    EXEC (@sql_str)
    end

     再来上两个效果图,图一是原数据:

    图二是变换过后的数据:

    补充一句:这个proc适用于单条,如果对于多条的话把传入的条件去掉

    USE [MC_QMS]
    GO
    /****** Object:  StoredProcedure [dbo].[show_mftf]    Script Date: 11/14/2018 16:58:19 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    /*******************************************
    **过程名:[show_mftf]
    **输入参数:参数A
    **@JLNO:记录号
    **输出:
    **功能描述:动态列转行
    **作者:
    **更新:修改人xxx;修改日期xxxx
    **版本:
    ********************************************/
    ALTER proc [dbo].[show_mftf]
    as
    begin
    DECLARE @sql_str NVARCHAR(MAX)
    DECLARE @sql_col NVARCHAR(MAX)
    DECLARE @tableName SYSNAME --行转列表
    DECLARE @groupColumn SYSNAME --分组字段
    DECLARE @row2column SYSNAME --行变列的字段
    DECLARE @row2columnValue SYSNAME --行变列值的字段
    SET @tableName = 'MC_TF_JXYDJY'
    SET @groupColumn = '记录号'
    SET @row2column = 'PROJECT'
    SET @row2columnValue = 'NUM'
    
    
    --从行数据中获取可能存在的列
    SET @sql_str = N'
    SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['+@row2column+']) 
        FROM ['+@tableName+']  GROUP BY ['+@row2column+']' 
    --PRINT @sql_str
    EXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@sql_col_out=@sql_col OUTPUT
    --PRINT @sql_col
    
    SET @sql_str = N'
    SELECT pvt.* FROM (
        SELECT ['+@groupColumn+'],['+@row2column+'],['+@row2columnValue+'] FROM ['+@tableName+']) p PIVOT  
        (SUM(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+ @sql_col +') ) AS pvt 
        '
    --print @sql_str
    EXEC sp_executesql @sql_str
    end

    然后显示出来的结果:

     

    显示全部时候:这个动态是对一个表中的行要相同的,因为不相同的话,查出来的数据的列就会被第一条数据的列名占用,然后值用null填充了。

     如果用一个表的内部项目不同的话,就要分开显示了,前面用标识区分,这样就能显示对应的项目了。
    **********初心不改,方得始终。
  • 相关阅读:
    要想成为前端大神,那些你不得不知晓的web前端命名规范。
    正确开启Mockjs的三种姿势:入门参考(一)
    1024码农节-向自己致敬!
    ES6 常用总结(前端开发js技术进阶提升总结)
    JS快速构建数组方法
    React绑定事件动态化的实现方法
    JQ遇到$(‘.xxx’).attr(‘display’)一直返回undefined
    你所要掌握的最简单基础的React渲染优化
    MyBatis Generator
    Spring boot集成redis初体验
  • 原文地址:https://www.cnblogs.com/salv/p/9929445.html
Copyright © 2011-2022 走看看