SQL SERVER特殊行转列案列一则

原文:SQL SERVER特殊行转列案列一则

今天有个同事找我,他说他有个需求,需要进行行转列,但是又跟一般的行转列有些区别,具体需求如下所说,需要将表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

时间: 2024-08-28 13:26:53

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

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

一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL,动态列字段: 方法三:使用PIVOT关系运算符,静态列字段: 方法四:使用PIVOT关系运算符,动态列字段: 扩展阅读一:参数化表名.分组列.行转列字段.字段值: 扩展阅读二:在前面的基础上加入条件过滤: 参考文献(References) 二.背景(Contexts) 其实行转列并不是一个什么新鲜的

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

传统的关系数据库服务引擎往往并不是对超大量数据进行分析计算的最佳平台,为此,SQL Server中开发了分析服务引擎去对大笔数据进行分析计算.当然,对于数据的存放平台SQL Server数据库引擎而言,也是需要强大的数据处理能力的. 在SQL Server 2012时,SQL Server 引入了列存储索引,用以显著提供高传统数据仓库类型语句的性能,并在SQL Server 2014中做了进一步加强.本文将在对SQL Server 2012列存储索引简单介绍的基础上,进一步解释SQL Serve

SQL Server 强行Insert包含自增列值的记录

SET IDENTITY_INSERT 表 ON INSERT INTO 表 ([ID] ,[SequenceNumber] ,[EnumCode] ,[Description]) VALUES (6 ,1 ,'Empty' ,'Empty') SET IDENTITY_INSERT 表 OFF 此处ID为自增列 SQL Server 强行Insert包含自增列值的记录,布布扣,bubuko.com

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

注: sql server 2005 及以上支持. 版本估计是不支持(工作环境2005,2008). 工作需要, 需要向SQL Server 现有表中添加新列并添加描述. 从而有个如下存储过程. (先附上存储过程然后解释) 代码 /********调用方法********** 作用: 添加列并添加列描述信息 调用: exec [SetColumnInfo] '表名', '列名', N'列说明,描述','列类型{默认:NVARCHAR(50)}','列默认值{默认:NULL}' *********

SQL Server 2016 行级别权限控制

原文:SQL Server 2016 行级别权限控制 背景 假如我们有关键数据存储在一个表里面,比如人员表中包含员工.部门和薪水信息.只允许用户访问各自部门的信息,但是不能访问其他部门.一般我们都是在程序端实现这个功能,而在sqlserver2016以后也可以直接在数据库端实现这个功能. 解决 安全已经是一个数据方面的核心问题,每一代的MS数据库都有关于安全方面的新功能,那么在Sql Server 2016,也有很多这方面的升级,比如'Row Level Security', 'Always E

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

这里向大家介绍一个新的生成T-SQL脚本的SQL Server命令行工具:mssql-scripter.它支持在SQL Server.Azure SQL DB以及Azure SQL DW中为数据库生成CREATE和INSERT T-SQL脚本. Mssql-scripter是一个跨平台的命令行工具,功能等同于SQL Server Management Studio中的Generate and Publish Scripts Wizard. 咱们能够在Linux.macOS和Windows上使用它

sql server显示行号

-- 工具->--   选项->--   文本编辑器-> --   所有语言->--   常规-> --   显示->--    行号 sql server显示行号,布布扣,bubuko.com

SQL Server 动态行转列(轉載)

一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段; 方法二:使用拼接SQL,动态列字段; 方法三:使用PIVOT关系运算符,静态列字段; 方法四:使用PIVOT关系运算符,动态列字段; 二.背景(Contexts) 其实行转列并不是一个什么新鲜的话题了,甚至已经被大家说到烂了,网上的很多例子多多少少都有些问题,所以我希望能让大家快速的看到执行的效果,所以在动态列的基础上再把

SQL SERVER PIVOT 行转列、列传行

在数据库操作中,有些时候我们遇到需要实现"行转列"的需求,例如一下的表为某店铺的一周收入情况表: WEEK_INCOME(WEEK VARCHAR(10),INCOME DECIMAL) 我们先插入一些模拟数据: INSERT INTO WEEK_INCOME SELECT '星期一',1000 UNION ALL SELECT '星期二',2000 UNION ALL SELECT '星期三',3000 UNION ALL SELECT '星期四',4000 UNION ALL SE