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

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

INSERT INTO TEST 

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

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

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

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

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

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

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

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

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

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

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

WITH T

AS

(

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

) 

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

FROM

(

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

UNION ALL

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

) TT

GROUP BY NO

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

WITH T

AS

(

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

) 

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

   , MAX(NAME2) AS NAME2 , MAX(VALUE2) AS VALUE2

   , MAX(NAME3) AS NAME3 , MAX(VALUE3) AS VALUE3

   , MAX(NAME4) AS NAME4 , MAX(VALUE4) AS VALUE4

FROM

(

SELECT NO, NAME AS NAME , VALUE AS VALUE  , 

     NULL AS NAME2, NULL  AS VALUE2 ,

     NULL AS NAME3, NULL  AS VALUE3 ,

     NULL AS NAME4, NULL  AS VALUE4

FROM T WHERE ROWID =1

UNION ALL

SELECT NO, NULL AS NAME ,  NULL AS VALUE  , 

     NAME AS NAME2, VALUE AS VALUE2 ,

     NULL AS NAME3, NULL  AS VALUE3 ,

     NULL AS NAME3, NULL  AS VALUE4

FROM T WHERE ROWID =2

UNION ALL

SELECT NO, NULL AS NAME , NULL  AS VALUE  , 

     NULL AS NAME2, NULL  AS VALUE2 ,

     NAME AS NAME3, VALUE AS VALUE3 ,

     NULL AS NAME4, NULL  AS VALUE4

FROM T WHERE ROWID =3

UNION ALL

SELECT NO, NULL AS NAME , NULL  AS VALUE  , 

     NULL AS NAME2, NULL  AS VALUE2 ,

     NULL AS NAME3, NULL  AS VALUE3 ,

     NAME AS NAME4, VALUE AS VALUE4 

FROM T WHERE ROWID =4

) TT

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. cocopads命令行

  2. 微信公众平台开发(二)——access_token、日志

    一.access_token 1)两种access_token,网页授权access_token和普通access_token 1.微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后, ...

  3. Android 数据库框架OrmLite的使用(二)

    前面说了OrmLite的基本使用,现在说下更规范的做法以及常用的一些功能. 1.DatabaseHelper package com.example.ormlite.db; import java.s ...

  4. Centos7下修改mysql5.6编码方式 解决网站中文显示问号

    解决办法: 修改MySQL数据库字符编码为UTF-8,UTF-8包含全世界所有国家需要用到的字符,是国际编码. 具体操作: 1.进入MySQL控制台 mysql  -u root -p 输入密码 查看 ...

  5. .NET设计模式(2):1.2 抽象工厂模式(Abstract Factory)

    概述 抽象工厂模式(Abstract Factory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口 ...

  6. jsp原理

    在eclipse里jsp编译后的java和class文件的位置 eclipse版本不一样,位置也不一样第一种:1.java类编译后产生的.class文件在D:\workspace\test\WEB-I ...

  7. C#不对称加密

    对称加密的缺点是双方使用相同的密钥和IV进行加密.解密.由于接收方必须知道密钥和IV才能解密数据,因此发送方需要先将密钥和IV传递给接收方.这就 有一个问题,如果攻击者截获了密钥和IV,也就等于知道了 ...

  8. 【新技术】CentOS系统下docker的安装配置及使用详解

    1 docker简介    Docker 提供了一个可以运行你的应用程序的封套(envelope),或者说容器.它原本是dotCloud 启动的一个业余项目,并在前些时候开源了.它吸引了大量的关注和讨 ...

  9. HashTable(散列表)

    最近都在研究数据结构,关于hashtable,或者叫做散列表,过去一直不了解是什么东西,现在终于明白了. 所谓hashtable,就是某组key,通过某个关系(函数),得到一个与之对应的映射值(在计算 ...

  10. Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/java/nio_reactor/ Java I/O模型 同步 vs. 异步 同步I/O 每个请求必须逐个地被处理,一个请 ...