将一列中多行相同的值只显示在一行

数据库 SQL Server
简单说下我的实现思路: 1.按id、name排序给原始数据生成行号 2.用递归判断上下行的id是否相等,第一次出现计数器初始值为1,后面再出现则计数器+1 3.对步骤2中生成的结果集再处理,计数器为1的id不变,计数器大于1则id为空字符串

   数据库环境:SQL SERVER 2008R2

  需求如题,左图为初始数据,右图是已实现需求的数据展示

 

  简单说下我的实现思路

  1.按id、name排序给原始数据生成行号

  2.用递归判断上下行的id是否相等,***次出现计数器初始值为1,后面再出现则计数器+1

  3.对步骤2中生成的结果集再处理,计数器为1的id不变,计数器大于1则id为空字符串

  我把实现的代码贴出来

 

  1. /*准备基础数据*/ 
  2. WITH    x0 
  3.           AS ( SELECT   1 AS id , 
  4.                         'a' AS NAME 
  5.                UNION ALL 
  6.                SELECT   1 AS id , 
  7.                         'b' AS NAME 
  8.                UNION ALL 
  9.                SELECT   1 AS id , 
  10.                         'c' AS NAME 
  11.                UNION ALL 
  12.                SELECT   2 AS id , 
  13.                         'e' AS NAME 
  14.                UNION ALL 
  15.                SELECT   2 AS id , 
  16.                         'd' AS NAME 
  17.                UNION ALL 
  18.                SELECT   3 AS id , 
  19.                         'f' AS NAME 
  20.                UNION ALL 
  21.                SELECT   4 AS id , 
  22.                         'h' AS NAME 
  23.                UNION ALL 
  24.                SELECT   4 AS id , 
  25.                         'j' AS NAME 
  26.              ),/*按id、name排序生成行号*/ 
  27.         x1 
  28.           AS ( SELECT   ROW_NUMBER() OVER ( ORDER BY id, name ) AS tid , 
  29.                         CAST(id AS VARCHAR(2)) id , 
  30.                         name 
  31.                FROM     x0 
  32.              ),/*递归设置计数器*/ 
  33.         x2 ( tid, id, namelevel ) 
  34.           AS ( SELECT   tid , 
  35.                         id , 
  36.                         name , 
  37. AS level 
  38.                FROM     x1 
  39.                WHERE    tid = 1 
  40.                UNION ALL 
  41.                SELECT   t1.tid , 
  42.                         t1.id , 
  43.                         t1.NAME , 
  44.                         CASE WHEN t1.id = t2.id THEN level + 1 
  45.                              ELSE 1 
  46.                         END level 
  47.                FROM     x1 t1 
  48.                         INNER JOIN x2 t2 ON t1.tid = t2.tid + 1 
  49.              ) 
  50.     /*计数器为1则id不动,否则置为空字符串*/ 
  51.     SELECT  CASE WHEN level = 1 THEN id 
  52.                  ELSE '' 
  53.             END id , 
  54.             name 
  55.     FROM    x2 

 

  先比我的实现,有一网友提供了更简单的实现方式

  我们来看一下他是怎么实现的 

  1. WITH    x0 
  2.           AS ( SELECT   1 AS id , 
  3.                         'a' AS NAME 
  4.                UNION ALL 
  5.                SELECT   1 AS id , 
  6.                         'b' AS NAME 
  7.                UNION ALL 
  8.                SELECT   1 AS id , 
  9.                         'c' AS NAME 
  10.                UNION ALL 
  11.                SELECT   2 AS id , 
  12.                         'e' AS NAME 
  13.                UNION ALL 
  14.                SELECT   2 AS id , 
  15.                         'd' AS NAME 
  16.                UNION ALL 
  17.                SELECT   3 AS id , 
  18.                         'f' AS NAME 
  19.                UNION ALL 
  20.                SELECT   4 AS id , 
  21.                         'h' AS NAME 
  22.                UNION ALL 
  23.                SELECT   4 AS id , 
  24.                         'j' AS NAME 
  25.                UNION ALL 
  26.                SELECT   1 AS id , 
  27.                         'j' AS NAME 
  28.              ) 
  29.     SELECT  REPLACE(CASE WHEN ROW_NUMBER() OVER ( PARTITION BY CAST(ID AS VARCHAR(2)) ORDER BY NAME ) <> '1' 
  30.                          THEN 0 
  31.                          ELSE CAST(ID AS VARCHAR(20)) 
  32.                     END, 0, ''AS ID , 
  33.             NAME 
  34.     FROM    x0 

 

实现的思路和我一样,但他的方法比我的简单,也容易理解。

我相信,实现该需求的方法不局限于这2种,欢迎各位看官提出更多的解题方法。

(本文完)

责任编辑:honglu 来源: 博客园
相关推荐

2009-07-28 08:36:45

TemplateFie

2020-08-24 08:25:48

Python开发工具

2019-12-25 14:08:50

Pandas数据计算

2022-11-08 09:38:18

Linux命令行删除文件

2016-12-02 08:53:18

Python一行代码

2011-08-25 09:17:31

Java调用存储过程返回一行或多行结果集

2021-01-21 15:44:03

vlookup函数数据区域Match函数

2010-10-27 13:16:41

oracle并行查询

2017-04-05 11:10:23

Javascript代码前端

2022-11-03 10:36:30

Linux隐藏文件

2021-11-02 16:25:41

Python代码技巧

2010-09-10 13:37:59

SQLCOUNT()函数

2018-01-30 08:47:46

存储查询性能

2022-04-09 09:11:33

Python

2014-02-12 13:43:50

代码并行任务

2020-08-12 14:54:00

Python代码开发

2022-09-25 00:07:18

Python图形界面

2021-07-19 07:58:02

Spark DataFrame 分布式

2021-07-26 10:32:54

MySQL数据库存储

2016-12-16 19:13:33

扩展性数据库
点赞
收藏

51CTO技术栈公众号