SQL Server行转列、不确定列的行转列

本文使用的方法:

1、用Case When

2、PIVOT函数

首先,模拟一张表:

CREATE TABLE TempSubjectResult
(
StudentName NVARCHAR(50) NOT NULL,
StudentSubject NVARCHAR(50) NOT NULL,
StudentGrade DECIMAL(4,1) NOT NULL
)
INSERT INTO TempSubjectResult(StudentName,StudentSubject,StudentGrade) VALUES ('小姚','语文','80')
INSERT INTO TempSubjectResult(StudentName,StudentSubject,StudentGrade) VALUES ('小姚','数学','70')
INSERT INTO TempSubjectResult(StudentName,StudentSubject,StudentGrade) VALUES ('小姚','英语','60')
INSERT INTO TempSubjectResult(StudentName,StudentSubject,StudentGrade) VALUES ('小明','语文','90')
INSERT INTO TempSubjectResult(StudentName,StudentSubject,StudentGrade) VALUES ('小明','数学','95')
INSERT INTO TempSubjectResult(StudentName,StudentSubject,StudentGrade) VALUES ('小明','英语','98')SELECT * FROM TempSubjectResult

表数据为:

-----------------------------------------------------------------------------普通版:转置的列确定-----------------------------------------------------------------------------

方法一:Case When

-- 1 Case When普通版
SELECT StudentName 学生名,MAX(CASE WHEN StudentSubject='语文' THEN StudentGrade END) 语文,MAX(CASE WHEN StudentSubject='数学' THEN StudentGrade END) 数学,MAX(CASE WHEN StudentSubject='英语' THEN StudentGrade END) 英语FROM TempSubjectResultGROUP BY StudentName

方法二:PIVOT函数

SELECT * FROM TempSubjectResult PIVOT(MAX(StudentGrade) FOR StudentSubject IN([语文],[数学],[英语])) T

以上为知道学科有“语文、数学、英语”,如果不确定科目呢?

此时可以用动态SQL查询,请看进阶版

-----------------------------------------------------------------------------升级版:转置的列不确定-----------------------------------------------------------------------------

方法三、 Case When升级版 动态SQL

-- Case When升级版 动态SQL
DECLARE @SqlText NVARCHAR(4000)='SELECT StudentName ''学生名'', ' -- SQL头部分 SELECT
SELECT @SqlText=@SqlText+' MAX(CASE WHEN StudentSubject='''+StudentSubject+''' THEN StudentGrade END) '''+StudentSubject +''',' FROM (SELECT DISTINCT StudentSubject FROM TempSubjectResult) T -- 拼接CASE WHEN
SELECT @SqlText= LEFT(@SqlText,LEN(@SqlText)-1)+' FROM #TempSubjectResult GROUP BY StudentName' -- 拼接 FROM后面部分
PRINT @SqlText
EXEC (@SqlText)

方法四、PIVOT升级版 动态SQL

-- PIVOT升级版 动态SQL
DECLARE @SqlSubject NVARCHAR(4000)
SELECT @SqlSubject= STUFF((SELECT '],[' + T.StudentSubject FROM (SELECT DISTINCT StudentSubject FROM TempSubjectResult) T  FOR XML PATH('')),1,2,'')+']' -- 获取PIVOT科目
DECLARE @SqlPIVOT NVARCHAR(4000)='SELECT * FROM #TempSubjectResult PIVOT(MAX(StudentGrade) FOR StudentSubject IN('+@SqlSubject+')) T' -- 拼接PIVOT
PRINT @SqlPIVOT
EXEC (@SqlPIVOT)

以下情况推荐使用动态转换:

1、需要转置的列不确定,比如转置月的天数,月份的天数有28.29.30.31天,不确定
2、需要转置的列非常多时候,不方便一个个写

SqlServer行转列相关推荐

  1. sqlserver 行转列

    还写了一篇Linq 实现 DataTable 行转列有时间大家可以看一下 sqlserver把行转成列在我们编码中是经常遇到的我做一个小例子大家看一下 1 --创建一个表 2 create table ...

  2. oracle行转列和sqlserver行转列语法分析比对

    前言 最近遇到一些老项目,在实施过程中需要切换数据库,遇到了好几处行转列的语法,在网上找了一些资料后,都不能很好的解释分析,下面我将个人在工作中遇到的一些问题以及解决方案详细的描述记录下来,如果有遇到 ...

  3. SqlServer行转列列转行

    行转列 创建语句: create table test1(id int identity(1,1) not null,name varchar(255) null,course varchar(255 ...

  4. Sqlserver行转列pivot()

    PIVOT概述: PIVOT用于将列值旋转为列名(即行转列),并在必要时对最终输出中所需的任何其余列值执行聚合. PIVOT的一般语法: SELECT [新表字段1,2,3-] FROM [原表名] ...

  5. SQLServer 行转列,统计,二次分组

    create table test (   bizdate datetime, --日期   classes varchar(50), --班次 '白班' 或 '夜班'   qty int --产量 ...

  6. SqlServer 行转列

    SELECT 列名+',' FROM 表名 FOR XML PATH('') 转载于:https://www.cnblogs.com/licin/p/6490822.html

  7. mysql行转列sql函数_sql动态行转列的两种方法

    第一种方法: 代码如下: select *from ( select Url,case  when  Month=01 then  '1月' when  Month=02 then '2月' when ...

  8. Linq 实现 DataTable 行转列

    前几天写了一篇sqlserver  行转列,http://www.cnblogs.com/li-peng/archive/2012/02/01/2334973.html 由于工作需要,要把查出来的Da ...

  9. mysql列转行统计查询_Mysql 列转行统计查询 、行转列统计查询

    Mysql group_concat函数列转行,与行转列 例一: SELECT num from user 1.使用group_concat函数得到列转行 select group_concat(nu ...

最新文章

  1. C#和Java的闭包-Jon谈《The Beauty of Closures》
  2. matlab从入门到精通-matlab计算机仿真与蒙特卡洛法【数学建模】
  3. 牛客练习赛43 Tachibana Kanade Loves Probability(快速幂)
  4. JS----JavaScript数组方法及总结
  5. 70%以上程序员,不懂数据结构和算法!
  6. exe解包和重新打包_Jira 批量提交问题 + 生成可执行文件exe
  7. ASP.NET性能优化之分布式Session
  8. maven坐标Dependencies和Exclusions详解
  9. pandas—pd.DataFrame.sample
  10. 解决MAPGIS导出数据乱码
  11. 无效的列类型 || Mbatis-Plus链接oracle
  12. 华硕老毛子(Padavan)——锐捷6.41,静态ip,学生破解过程分享,非专业仅供参考,啰嗦的一批,有耐心能看懂
  13. JS学习之路系列总结四象阵(此文犹如武林之中的易筋经,是你驰骋IT界的武功心法,学会JS五大阵法就学会了JS,博主建议先学三才阵)
  14. mysql默认编码改为gbk_查看改mysql编码方式让它支持中文(gbk或者utf8)
  15. 常用的Linux命令.cmd
  16. Java RPC 分布式框架性能大比拼,Dubbo排老几?
  17. 算出指定日期在当年的第几周
  18. unzip解压带密码的压缩包
  19. 国标28181:国标编码
  20. python推荐书籍

热门文章

  1. Spring-读取properties文件
  2. Linux C基础笔记(2)
  3. 前端知识整理 CSS盒模型
  4. BZOJ2689 : 堡垒
  5. MVC源码解析 - 配置注册 / 动态注册 HttpModule
  6. 前缀式计算(前缀表达式)
  7. 红黑树(Red-Black Tree)
  8. 开博1个月不到,照样可以申请到text-link-ads
  9. react-native gradle
  10. js动态产生对象push进数组,发现数组所有元素(element or object)一样