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)
    

      

      

  • 相关阅读:
    JavaScript中需要注意的几个问题
    前端编码规范之JavaScript
    那些年,我们一起玩过的响应式布局
    前端编码规范之CSS
    一个不陌生的JS效果-marquee,用css3来实现
    解读jQuery中extend函数
    字体大小自适应纯css解决方案
    浅谈叶小钗面试的几个问题
    【Python开发】C和Python之间的接口实现
    【Python开发】【编程开发】各种系统的清屏操作命令
  • 原文地址:https://www.cnblogs.com/mfkaudx/p/3507286.html
Copyright © 2011-2022 走看看