• 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
  • 相关阅读:
    ACM: Copying Data 线段树-成段更新-解题报告
    POJ 2488 A Knight's Journey
    POJ 3349 Snowflake Snow Snowflakes Hash
    POJ 2299 Ultra-QuickSort 归并排序、二叉排序树,求逆序数
    POJ 1035 Spell checker 简单字符串匹配
    POJ 3267 The Cow Lexicon 简单DP
    POJ 1459 Power Network 最大流(Edmonds_Karp算法)
    POJ 3687 Labeling Balls 逆向建图,拓扑排序
    HDU 1532 Drainage Ditches 最大流 (Edmonds_Karp)
    POJ 3026 Borg Maze bfs+Kruskal
  • 原文地址:https://www.cnblogs.com/Scholars/p/13652008.html
Copyright © 2020-2023  润新知