zoukankan      html  css  js  c++  java
  • SQL Server 将两行或者多行拼接成一行数据

    一个朋友,碰到一个问题。

    就是查询出来的结果集,需要每隔三行。就将这三行数据以此拼接为一行显示。起初我想着用ROW_NUMBER加CASE WHEN去做,发现结果并非我预期那样。

    结果如下:

     由于别人的数据,不方便显示。查询出来还是为三行数据,只是将其余部分展现出了空值。这种结果是不行的。

    随后百度找到了,下面内容的百度经验。本想用这个数据集,以及语句贴上来。但还是因为不方便,就将那篇百度经验拿过来使用吧!

    下面的百度经验是针对于两行数据进行的操作,多行数据也可以操作。

     这里的左连接条件只需要写,下一行行数减一等于当前行数即可。以此类推

    例:

    FROM #tmpTest t1
    LEFT JOIN #tmpTest t2 ON t1.RowNum = t2.RowNum - 1
    LEFT JOIN #tmpTest t3 ON t2.RowNum = t3.RowNum - 1

    这样数据依然会是三行,但他会将第二行的数据在第一行的数据后进行拼接,将第三行的数据在第二行后进行拼接。

    假设你有三条数据,那么最终只需在查询结果中。针对于ROW_NUMBER排序后的行数进行取模拿到第一行便可得到你想要的数据。

    RowNum % 3 = 1

    有几行,便模于几。

    以下便是百度经验内容:

    SQL Server:按照数据库ROW_NUMBER()产生的行号,将相邻奇数行与偶数行拼接成一行。

    思路:使用表 左自连接。

     模拟数据源表结构,使用临时表

     插入模拟数据

     模拟按照Code栏位排序后生成 ROW_NUMBER() 行号

     将两行数据合并成一行,奇数行号在左侧,偶数行号在右侧

     模拟效果如下图所示

     

    完整的模拟过程SQL如下:
    
     -- 模拟数据源表结构
    
       create table #test(
    
        Code varchar(50),
    
        Remark varchar(200)
    
       )
    
       
    
       -- 模拟数据
    
       insert into #test(Code, Remark) values('A', 'A Remark');
    
       insert into #test(Code, Remark) values('B', 'B Remark');
    
       insert into #test(Code, Remark) values('C', 'C Remark');
    
       insert into #test(Code, Remark) values('D', 'D Remark');
    
       
    
       -- 模拟按照Code栏位排序后生成行号
    
       select  ROW_NUMBER() over(order by Code) as RowNum, Code
    
                 ,Remark
    
       into #tmpTest
    
       from #test
    
       order by Code
    
       
    
       -- 将两行数据合并成一行,奇数行号在左侧,偶数行号在右侧
    
       select test1.RowNum
    
                 ,test1.Code
    
                 ,test1.Remark
    
                 ,test2.RowNum as RowNum2
    
                 ,test2.Code AS Code2 
    
                 ,test2.Remark AS Remark2
    
       from #tmpTest test1
    
       left join #tmpTest test2 on test1.RowNum = test2.RowNum -1 
    
                                            and test2.RowNum % 2 = 0
    
       where test1.RowNum % 2 =1
  • 相关阅读:
    代码review之 isInfoEnable()
    sdk、jdk、jre、jvm、jdt、cdt分别都是什么东西
    思考总结: 决胜21点 开篇 概率问题
    Java多线程开发系列之四:玩转多线程(线程的控制2)
    Java多线程开发系列之四:玩转多线程(线程的控制1)
    Java多线程开发系列之三:线程这一辈子(线程的生命周期)
    Java多线程开发系列之二:如何创建多线程
    [系列] Gin框架
    [系列] Gin框架
    [系列] Gin 框架
  • 原文地址:https://www.cnblogs.com/Scholars/p/13652008.html
Copyright © 2011-2022 走看看