zoukankan      html  css  js  c++  java
  • Sql 行转换为列 以及列转换为行的心得



    这是 创建数据库的脚本文件

    CREATE TABLE [dbo].[stu](
    	[学号] [nvarchar](255) NOT NULL,
    	[姓名] [nvarchar](255) NULL,
    	[性别] [nvarchar](255) NULL,
    	[专业] [nvarchar](255) NULL,
    	[院系] [nvarchar](255) NULL
    ) ON [PRIMARY]
    
    GO
    INSERT [dbo].[stu] ([学号], [姓名], [性别], [专业], [院系]) VALUES (N'111405060432', N'王小明', N'男', N'金融系', N'经济学院')
    INSERT [dbo].[stu] ([学号], [姓名], [性别], [专业], [院系]) VALUES (N'07102060215', N'王硕问', N'男', N'材料成型及控制工程', N'材料科学与工程学院')
    INSERT [dbo].[stu] ([学号], [姓名], [性别], [专业], [院系]) VALUES (N'07104060407', N'冯静', N'女', N'金融学', N'经济学院')
    INSERT [dbo].[stu] ([学号], [姓名], [性别], [专业], [院系]) VALUES (N'07108040122', N'王新哲', N'男', N'环境工程', N'化工与制药学院')
    INSERT [dbo].[stu] ([学号], [姓名], [性别], [专业], [院系]) VALUES (N'07110020114', N'刘龙', N'男', N'应用物理学', N'物理与工程学院')
    

      


    --------行值转为列值  使用Case语句    方法一
    SELECT  学号
        ,Max(CASE 专业 WHEN '金融系' THEN  院系 else 院系  END) AS '金融系'
        ,Max(CASE 专业 WHEN '材料成型及控制工程' THEN 院系  else 院系  END) AS '材料成型及控制工程'
        ,Max(CASE 专业 WHEN '金融学' THEN 院系  else 院系  END) AS '金融学'
        ,Max(CASE 专业 WHEN '环境工程' THEN 院系  else 院系  END) AS '环境工程'
        ,Max(CASE 专业 WHEN '应用物理学' THEN 院系 else 院系  END) AS '应用物理学'
    FROM
        stu
    GROUP BY 学号
    go
    
    ------行转换列值   ------    方法二
    declare @sql varchar(8000)
    
    select @sql=isnull(@sql+',','')+' max(case 专业 when '''+专业+''' then 院系 else 院系  end) ['+专业+']'
    
    from(select distinct 专业 from stu)as a      
    
    set @sql='select 学号 ,'+@sql+' from stu group by 学号'
    
    exec(@sql)
    go
    
     -----使用isnull()-----
    declare @sql varchar(8000)
    
    select @sql=isnull(@sql+',','')+ 专业 from stu  group by 专业           
    
    set @sql='select * from stu pivot (max(院系) for 专业 in ('+@sql+'))a'
    
    exec(@sql)
    go
    
    ----------使用pivot --------

    select * -----要选取的列, * 代表选择全部 from stu -------从哪个结果集中选出数据 pivot( max(院系) --聚合函数Max表示你需要怎样处理转换后的列的值,是总和(sum),还是平均(avg)还是min,max等等。 for 专业 ---- for 专业 就是说将 专业 列的值分别转换成一个个列,也就是“以值变列”。 in -------我们只想取其中几个值转换成列,那么怎样取呢?就是在in里面写要取的值 (材料科学与工程学院,经济学院,化工与制药学院,物理与工程学院,金融学))--- as b go -----------列转行 --------------------- -----使用SQL Server 2005动态SQL declare @sql nvarchar(4000) select @sql=isnull(@sql+',','')+quotename(Name) from syscolumns where ID=object_id('stu')and Name not in('姓名','学号','专业','性别') order by Colid set @sql='select 学号,姓名,[专业],性别 from stu unpivot ([aa] for [bb] in('+@sql+'))b' exec(@sql) go
    ------方法二------------
    select * from ( select 学号,姓名,性别,专业='金融系',院系='经济学院' from stu union all select 学号,姓名,性别,专业='材料成型及控制工程',院系='材料科学与工程学院' from stu union all select 学号,姓名,性别,专业='金融学',院系='经济学院' from stu ) t order by 学号 go
    ----------使用 unpivot----------
    select aa,bb from stu unpivot (aa for bb in([院系],[专业])) t

     ---------列转行-----

    --------行转列------

  • 相关阅读:
    Cocostudio学习笔记(2) Button + CheckBox
    Oracle会话及连接数优化
    linux zip压缩和解压的各种操控
    Linux select 机制深入分析
    算法的时间复杂度
    findmaven的英文版本号上线了
    XML高速入门
    spring xml properties split with comma for list
    There is an error in invoking javac. A full JDK (not just JRE) is required
    [Swift]LeetCode134. 加油站 | Gas Station
  • 原文地址:https://www.cnblogs.com/luoyangcn/p/3893279.html
Copyright © 2011-2022 走看看