博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL SERVER特殊行转列案列一则
阅读量:6036 次
发布时间:2019-06-20

本文共 2323 字,大约阅读时间需要 7 分钟。

原文:

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

转载地址:http://ksohx.baihongyu.com/

你可能感兴趣的文章
Ubuntu11.04上tftp服务的配置
查看>>
咏南IOCP REST中间件
查看>>
DataGrid的小技巧之toopTip
查看>>
SQL Server 2012实施与管理实战指南
查看>>
UNREFERENCED_PARAMETER的用处
查看>>
ASP.NET MV“.NET研究”C3 基础教程 – Web Pages 1.0
查看>>
阻止 submit 提交 (含 FireFox)
查看>>
结构之法算法之道blog最新博文集锦第6期CHM文件0积分下载
查看>>
UIView 中常见的方法总结
查看>>
mysql 导入设置字符集
查看>>
PDF.NET数据开发框架实体类操作实例
查看>>
const!指针!
查看>>
已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。
查看>>
静态方法中调用非静态方法
查看>>
Block(二)内存管理与其他特性-b
查看>>
记录锁
查看>>
Buildroot lmbench使用方法
查看>>
VB/VBS 发送邮件代码
查看>>
【转载】iphone 重力感应器详解.
查看>>
NHibernate初学者指南(21):开发中常见的错误(二)
查看>>