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填充了。

     如果用一个表的内部项目不同的话,就要分开显示了,前面用标识区分,这样就能显示对应的项目了。
    **********初心不改,方得始终。
  • 相关阅读:
    带掩码的自编码器MAE详解和Pytorch代码实现
    联邦学习(Federated Learning)详解以及示例代码
    SIMILAR:现实场景中基于子模块信息度量的主动学习
    BERT 模型的知识蒸馏: DistilBERT 方法的理论和机制研究
    为什么 Pi 会出现在正态分布的方程中?
    快到周五了
    土豆
    忙碌的周末
    周五了
    写给妹妹的祝福语
  • 原文地址:https://www.cnblogs.com/salv/p/9929445.html
Copyright © 2011-2022 走看看