zoukankan      html  css  js  c++  java
  • 行列转换/横转竖

      行列转化/横转竖这个在日常的工作中中算是比较常见的了,但长时间的不使用也难免忘记,这里做下备忘。

      场景Ⅰ-看图

      

      实现没有什么难度,直接上代码:  

    DECLARE @t TABLE(col VARCHAR(50))
    INSERT INTO @t SELECT 'A' 
    UNION ALL SELECT 'B'
    UNION ALL SELECT 'C'
    UNION ALL SELECT 'D'
    UNION ALL SELECT 'E'
    UNION ALL SELECT 'F'
    UNION ALL SELECT 'G'
    UNION ALL SELECT 'H'
    UNION ALL SELECT 'I'
    UNION ALL SELECT 'J'
    UNION ALL SELECT 'K';
    
    
    DECLARE @str VARCHAR(2000)
    SELECT @str=ISNULL(@str+',','')+''+col+'='+ ''''+col+'''' FROM @t
    SET @str=N'select '+@str
    EXEC(@str)
    
    
    
    --需要物理表,使用国标表变量会报错,具体原因不详
    DECLARE @str VARCHAR(8000)
    SELECT @str=ISNULL(@str+',','')+'['+col+']' FROM @t GROUP BY col
    SET  @str='SELECT * FROM @t PIVOT(MAX(col) FOR quaters in('+@str+'))a'
    --PRINT @str
    EXEC(@str)
    

     场景Ⅱ-进阶上图

       

      这个是不是比场景Ⅰ中的有意思的多,废话不多说,上代码:  

    DECLARE @MyTest TABLE(product varchar(50),[200301] int,[200302] int,[200303] int )
    INSERT INTO @MyTest SELECT '干果',1000,1200,1800
    UNION ALL SELECT '海鲜',2200,2500,2800
    UNION ALL SELECT '粮油',3600,3800,4200
    SELECT * FROM @MyTest 
    
    DECLARE @prod1 VARCHAR(5000),@prod2 VARCHAR(5000),@prod3 VARCHAR(5000)
    SELECT 
    	@prod1=ISNULL(@prod1+',','')+ product+'='''+ CAST([200301] AS VARCHAR(50))+'''',
    	@prod2=ISNULL(@prod2+',','') + product+'='''+ CAST([200302] AS VARCHAR(50))+'''',
    	@prod3=ISNULL(@prod3+',','')+ product+'='''+ CAST([200303] AS VARCHAR(50))+'''' 
    FROM @MyTest
    
    SET @prod1='Select 日期=''200301'','+@prod1+' UNION ALL Select 日期=''200302'','+@prod2+' UNION ALL  Select 日期=''200303'','+@prod3
    
    EXEC(@prod1)
    

      当然上面的如果看着不熟悉,下面的代码一定不会陌生:

        

    CREATE TABLE #MyTC(YEARs INT, quaters INT,amount DECIMAL(18,2))
    INSERT INTO #MyTC 
    SELECT 1990,1,1.1 UNION ALL 
    SELECT 1990,2,1.2 UNION ALL 
    SELECT 1990,3,1.3 UNION ALL 
    SELECT 1990,4,1.4 UNION ALL 
    SELECT 1991,1,2.1 UNION ALL 
    SELECT 1991,2,2.2 UNION ALL 
    SELECT 1991,3,2.3 UNION ALL 
    SELECT 1991,4,2.4  
    
    SELECT * FROM #MyTC
    
    -- =============================================
    --固定式
    -- =============================================
    
    SELECT 
    年份=YEARs,
    一季度=MAX(CASE quaters WHEN 1 THEN amount END),
    二季度=MAX(CASE quaters WHEN 2 THEN amount END),
    三季度=MAX(CASE quaters WHEN 3 THEN amount END),
    四季度=MAX(CASE quaters WHEN 4 THEN amount END)
    FROM #MyTC GROUP BY YEARs
    
    -- =============================================
    --动态sql
    -- ============================================= 
    DECLARE @str VARCHAR(8000)
    SELECT @str=ISNULL(@str+',','')+ '['+CAST(quaters AS varchar)+ '季度]= MAX(CASE quaters WHEN '+CAST(quaters AS varchar)+' THEN amount END)' FROM #MyTC GROUP BY quaters
    SET @str=  'SELECT 年份=YEARs,'+ @str+ ' from #MyTC GROUP BY YEARs'
    PRINT @str
    EXEC(@str) 
    
    -- =============================================
    --固定PIVOT
    -- =============================================  
    SELECT * FROM #MyTC PIVOT(MAX(amount) FOR quaters in([1],[2],[3],[4]))a
    
    -- =============================================
    --动态PIVOT
    -- =============================================  
    DECLARE @str VARCHAR(8000)
    SELECT @str=ISNULL(@str+',','')+QUOTENAME(quaters) FROM #MyTC GROUP BY quaters
    SET  @str='SELECT * FROM #MyTC PIVOT(MAX(amount) FOR quaters in('+@str+'))a'
    --PRINT @str
    EXEC(@str)
    

      

      

  • 相关阅读:
    记一次曲折的运维经历-2020-04-23
    linux主机上执行wget命令遇到的问题
    linux系统上部署nfs服务
    【精】Linux磁盘I/O性能监控之iostat详解
    ssh_exchange_identification: Connection closed by remote host 解决方法
    nginx backup 功能
    mysql 报错 get error 28 from storage engine 解决方法
    mysql常用sql语句
    关于mysql 主从同步错误解决方法
    azure负载均衡上遇到的坑-12-28
  • 原文地址:https://www.cnblogs.com/mfkaudx/p/3507286.html
Copyright © 2011-2022 走看看