星空网 > 软件开发 > 数据库

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

数据库环境:SQL SERVER 2008R2

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

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

 简单说下我的实现思路

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

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

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

我把实现的代码贴出来

/*准备基础数据*/WITH  x0     AS ( SELECT  1 AS id ,            'a' AS NAME        UNION ALL        SELECT  1 AS id ,            'b' AS NAME        UNION ALL        SELECT  1 AS id ,            'c' AS NAME        UNION ALL        SELECT  2 AS id ,            'e' AS NAME        UNION ALL        SELECT  2 AS id ,            'd' AS NAME        UNION ALL        SELECT  3 AS id ,            'f' AS NAME        UNION ALL        SELECT  4 AS id ,            'h' AS NAME        UNION ALL        SELECT  4 AS id ,            'j' AS NAME       ),/*按id、name排序生成行号*/    x1     AS ( SELECT  ROW_NUMBER() OVER ( ORDER BY id, name ) AS tid ,            CAST(id AS VARCHAR(2)) id ,            name        FROM   x0       ),/*递归设置计数器*/    x2 ( tid, id, name, level )     AS ( SELECT  tid ,            id ,            name ,            1 AS level        FROM   x1        WHERE  tid = 1        UNION ALL        SELECT  t1.tid ,            t1.id ,            t1.NAME ,            CASE WHEN t1.id = t2.id THEN level + 1               ELSE 1            END level        FROM   x1 t1            INNER JOIN x2 t2 ON t1.tid = t2.tid + 1       )  /*计数器为1则id不动,否则置为空字符串*/  SELECT CASE WHEN level = 1 THEN id         ELSE ''      END id ,      name  FROM  x2

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

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

WITH  x0     AS ( SELECT  1 AS id ,            'a' AS NAME        UNION ALL        SELECT  1 AS id ,            'b' AS NAME        UNION ALL        SELECT  1 AS id ,            'c' AS NAME        UNION ALL        SELECT  2 AS id ,            'e' AS NAME        UNION ALL        SELECT  2 AS id ,            'd' AS NAME        UNION ALL        SELECT  3 AS id ,            'f' AS NAME        UNION ALL        SELECT  4 AS id ,            'h' AS NAME        UNION ALL        SELECT  4 AS id ,            'j' AS NAME        UNION ALL        SELECT  1 AS id ,            'j' AS NAME       )  SELECT REPLACE(CASE WHEN ROW_NUMBER() OVER ( PARTITION BY CAST(ID AS VARCHAR(2)) ORDER BY NAME ) <> '1'             THEN 0             ELSE CAST(ID AS VARCHAR(20))          END, 0, '') AS ID ,      NAME  FROM  x0

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

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

(本文完)




原标题:将一列中多行相同的值只显示在一行

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

「投稿时:vat号码是什么」:https://www.kjdsnews.com/a/1310812.html
《迪拜自贸区推行vat——多方受益,更好发展》:https://www.kjdsnews.com/a/1310813.html
《让你轻松了解德国vat税务计算!》:https://www.kjdsnews.com/a/1310814.html
《解析德国vat申报流程》——利用跨税云完成简易规范的vat申报:https://www.kjdsnews.com/a/1310815.html
亚马逊账号vat税号注销后能否继续使用?:https://www.kjdsnews.com/a/1311783.html
亚马逊英国:了解vat税率如何影响您的购物体验:https://www.kjdsnews.com/a/1311784.html
你更喜欢一个人旅行,还是一群人旅行? :https://www.vstour.cn/a/408249.html
延安市区景点都收费吗 延安景点要门票吗:https://www.vstour.cn/a/408250.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流