今天有个同事找我,他说他有个需求,需要进行行转列,但是又跟一般的行转列有些区别,具体需求如下所说,需要将表1的数据转换为表2的显示格式.

我想了一下,给出了一个解决方法,具体如下所示(先给出测试数据)

  1. INSERT INTO TEST

  1. SELECT 1,    1,    '定型名称',    '预定型'           UNION ALL

  1. SELECT 1,    2,    '进布方式',    '调平'             UNION ALL

  1. SELECT 1,    3,    '21米长定型机开机速度',    '25'    UNION ALL

  1. SELECT 1,    4,    '烘箱温度',    '195'             UNION ALL

  1. SELECT 1,    5,    '门幅(CM)',    '200-210-210'     UNION ALL

  1. SELECT 2,    1,    '过软',    'na'                  UNION ALL

  1. SELECT 2,    2,    '调平',    'na'                  UNION ALL

  1. SELECT 2,    3,    '25',    '+/-0.5'                UNION ALL

  1. SELECT 2,    4,    '150',    '+/-5℃头尾烘箱除外'   UNION ALL

  1. SELECT 2,    5,    '188-198-198',    '+/-3'

实现其功能的SQL语句如下所示

  1. WITH T

  1. AS

  1. (

  1. SELECT NO, ROW_NUMBER() OVER (PARTITION  BY NO ORDER BY STEP) AS ROWID, NAME, VAlUE FROM TEST

  1. )

  1. SELECT NO,  MAX(NAME) AS NAME, MAX(VALUE) AS VALUE, MAX(NAME2) AS NAME2 , MAX(VALUE2) AS VALUE2

  1. FROM

  1. (

  1. SELECT NO, NAME AS NAME, VALUE AS VALUE, NULL AS NAME2, NULL AS VALUE2 FROM T WHERE ROWID =1

  1. UNION ALL

  1. SELECT NO, NULL AS NAME ,NULL AS VALUE, NAME AS NAME2, VALUE AS VALUE2 FROM T WHERE ROWID =2

  1. ) TT

  1. GROUP BY NO

但是这样有一个弊端就是同一NO的记录不定(不知道有多少条记录),那么上面SQL语句就不知道怎么写了,好在这个需求每个NO最多只有四条记录,所以可以写成下面. 如果记录数再多的话,这个SQL语句就写的很纠结。暂时也没有想到更好的解决方法。

  1. WITH T

  1. AS

  1. (

  1. SELECT NO, ROW_NUMBER() OVER (PARTITION  BY NO ORDER BY STEP) AS ROWID, NAME, VAlUE FROM TEST

  1. )

  1. SELECT NO, MAX(NAME)  AS NAME  , MAX(VALUE)  AS VALUE 

  1.    , MAX(NAME2) AS NAME2 , MAX(VALUE2) AS VALUE2

  1.    , MAX(NAME3) AS NAME3 , MAX(VALUE3) AS VALUE3

  1.    , MAX(NAME4) AS NAME4 , MAX(VALUE4) AS VALUE4

  1. FROM

  1. (

  1. SELECT NO, NAME AS NAME , VALUE AS VALUE  ,

  1.      NULL AS NAME2, NULL  AS VALUE2 ,

  1.      NULL AS NAME3, NULL  AS VALUE3 ,

  1.      NULL AS NAME4, NULL  AS VALUE4

  1. FROM T WHERE ROWID =1

  1. UNION ALL

  1. SELECT NO, NULL AS NAME ,  NULL AS VALUE  ,

  1.      NAME AS NAME2, VALUE AS VALUE2 ,

  1.      NULL AS NAME3, NULL  AS VALUE3 ,

  1.      NULL AS NAME3, NULL  AS VALUE4

  1. FROM T WHERE ROWID =2

  1. UNION ALL

  1. SELECT NO, NULL AS NAME , NULL  AS VALUE  ,

  1.      NULL AS NAME2, NULL  AS VALUE2 ,

  1.      NAME AS NAME3, VALUE AS VALUE3 ,

  1.      NULL AS NAME4, NULL  AS VALUE4

  1. FROM T WHERE ROWID =3

  1. UNION ALL

  1. SELECT NO, NULL AS NAME , NULL  AS VALUE  ,

  1.      NULL AS NAME2, NULL  AS VALUE2 ,

  1.      NULL AS NAME3, NULL  AS VALUE3 ,

  1.      NAME AS NAME4, VALUE AS VALUE4

  1. FROM T WHERE ROWID =4

  1. ) TT

  1. GROUP BY NO

SQL SERVER特殊行转列案列一则的更多相关文章

  1. Expression构建DataTable to Entity 映射委托 sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。 sql server 多行数据合并成一列 C# 字符串大写转小写,小写转大写,数字保留,其他除外 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法 纯CSS打造淘宝导航菜单栏 C# Winform

    Expression构建DataTable to Entity 映射委托   1 namespace Echofool.Utility.Common { 2 using System; 3 using ...

  2. sql server 多行数据合并成一列

    首先是源数据: ),cip.CheckIn_StartTime, )),cip.CheckIn_EndTime, )),cip.Rental_Price)) as content from Check ...

  3. 在SQL Server 2014里可更新的列存储索引 (Updateable Column Store Indexes)

    传统的关系数据库服务引擎往往并不是对超大量数据进行分析计算的最佳平台,为此,SQL Server中开发了分析服务引擎去对大笔数据进行分析计算.当然,对于数据的存放平台SQL Server数据库引擎而言 ...

  4. 向SQL Server 现有表中添加新列并添加描述.

    注: sql server 2005 及以上支持. 版本估计是不支持(工作环境2005,2008). 工作需要, 需要向SQL Server 现有表中添加新列并添加描述. 从而有个如下存储过程. (先 ...

  5. 第十篇 SQL Server安全行级安全

    本篇文章是SQL Server安全系列的第十篇,详细内容请参考原文. 不像一些其他industrial-strength数据库服务,SQL Server缺乏一个内置保护个别数据记录的机制,称为行级安全 ...

  6. 【译】第十篇 SQL Server安全行级安全

    本篇文章是SQL Server安全系列的第十篇,详细内容请参考原文. 不像一些其他industrial-strength数据库服务,SQL Server缺乏一个内置保护个别数据记录的机制,称为行级安全 ...

  7. MSSQL-Scripter,一个新的生成T-SQL脚本的SQL Server命令行工具

    这里向大家介绍一个新的生成T-SQL脚本的SQL Server命令行工具:mssql-scripter.它支持在SQL Server.Azure SQL DB以及Azure SQL DW中为数据库生成 ...

  8. SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL, ...

  9. SQL Server 动态行转列(轉載)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段; 方法二:使用拼接SQL, ...

  10. SQL Server pivot 行转列遇到的问题

    前段时间开发系统时,有个功能是动态加载列,于是就使用了SQL Server自带的PIVOT函数进行行转列,开始用的非常溜,效果非常好.但是提交测试后问题来了,测试添加的列名中包含空格,然后就杯具了,功 ...

随机推荐

  1. DotNet隐藏敏感信息操作方法

    在项目中,有时候一些信息不便完全显示,只需要显示部分信息.现在提供一些隐藏敏感信息的操作方法,主要为对信息的截取操作: 1.指定左右字符数量,中间的*的个数和实际长度有关: /// <summa ...

  2. 【JUC】JDK1.8源码分析之ThreadPoolExecutor(一)

    一.前言 JUC这部分还有线程池这一块没有分析,需要抓紧时间分析,下面开始ThreadPoolExecutor,其是线程池的基础,分析完了这个类会简化之后的分析,线程池可以解决两个不同问题:由于减少了 ...

  3. ajax调用本地wcf中的post和get

    我们可以通过jQuery调用本地或者远程的wcf服务,本文讲解的是对本地wcf服务的post和get调用方式. post和get到底有什么区别呢?此处不作详述. 但是,post对请求的数据格式更为严格 ...

  4. 在IIS下部署Thinkphp项目,验证码不能显示的解决办法

    由于公司租用的是虚拟空间,而且用的是IIS服务器,所以部署PHP的时候就出现很多问题:比如昨天就碰到这个问题:在IIS下部署Thinkphp项目,验证码不能显示 这是生成验证码的方法: // 制作专门 ...

  5. iOS9的几个新关键字(nonnull、nullable、null_resettable、__null_unspecified)

    1.nonnull:字面意思就能知道:不能为空(用来修饰属性,或者方法的参数,方法的返回值) 代码: //三种使用方式都可以 @property (nonatomic, copy, nonnull) ...

  6. AngularJS----基本操作

    之前的学习基本了解了AngularJS的常用方法,下来就继续学习吧. 创建自定义的指令 除了内置指令,我们可以创建自定义指令.通过.directive函数来添加. <div change-dat ...

  7. WPF CheckBox 自定义样式

    WPF 自定义样式.CheckBox <Style x:Key="EmptyCheckBox" TargetType="CheckBox"> < ...

  8. 【Win10开发】Toast通知——后台激活

    前篇文章我们写了关于Toast的前台激活,那么接下来就讲一讲它的后台激活.当通知出现时并不会出现app的界面,但是app能在后台获取到通知中的信息. 关于xaml和Toast通知架构我们在这里就不再赘 ...

  9. Objective-c的@property(atomic,nonatomic,readonly,readwrite,assign,retain,copy,getter,setter) 属性特性

    assign:指定setter方法用简单的赋值,这是默认操作.你可以对标量类型(如int)使用这个属性.你可以想象一个float,它不是一个对象,所以它不能retain.copy. retain:指定 ...

  10. Verilog学习笔记简单功能实现(二)...............全加器

    先以一位全加器为例:Xi.Yi代表两个加数,Cin是地位进位信号,Cout是向高位的进位信号.列表有:   Xi     Yi    Cin Sum Cout 0 0 0 0 0 0 0 1 1 0 ...