zoukankan      html  css  js  c++  java
  • SQL SERVER特殊行转列案列一则

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

    image

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

    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 NOMAX(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

    clipboard[4]

    但是这样有一个弊端就是同一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(VALUEAS 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
  • 相关阅读:
    【JAVA SE基础篇】49.文件字符流和字节数组流
    【JAVA SE基础篇】48.IO流四大抽象类介绍和字节流
    【JAVA SE基础篇】47.file类的方法
    【JAVA SE基础篇】46.IO流的介绍
    【HTML篇】4.HTML的内嵌标签、框架标签、表单
    【HTML篇】3.HTML的图片标签、超链接标签、表格标签
    【HTML篇】2.HTML的head标签和body标签
    【HTML篇】1.HTML的介绍、三大基石、标准文档结构
    【JAVA SE基础篇】45.迭代器、Collections工具类以及使用容器存储表格
    【JAVA SE基础篇】44.手工实现简易HashMap和HashSet
  • 原文地址:https://www.cnblogs.com/kerrycode/p/4286066.html
Copyright © 2011-2022 走看看