將一列中多行相同的值只顯示在一行
數(shù)據(jù)庫環(huán)境:SQL SERVER 2008R2
需求如題,左圖為初始數(shù)據(jù),右圖是已實現(xiàn)需求的數(shù)據(jù)展示
簡單說下我的實現(xiàn)思路
1.按id、name排序給原始數(shù)據(jù)生成行號
2.用遞歸判斷上下行的id是否相等,***次出現(xiàn)計數(shù)器初始值為1,后面再出現(xiàn)則計數(shù)器+1
3.對步驟2中生成的結果集再處理,計數(shù)器為1的id不變,計數(shù)器大于1則id為空字符串
我把實現(xiàn)的代碼貼出來
- /*準備基礎數(shù)據(jù)*/
- 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
- ),/*遞歸設置計數(shù)器*/
- x2 ( tid, id, name, level )
- AS ( SELECT tid ,
- id ,
- name ,
- 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
- )
- /*計數(shù)器為1則id不動,否則置為空字符串*/
- SELECT CASE WHEN level = 1 THEN id
- ELSE ''
- END id ,
- name
- FROM x2
先比我的實現(xiàn),有一網友提供了更簡單的實現(xiàn)方式
我們來看一下他是怎么實現(xiàn)的
- 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
實現(xiàn)的思路和我一樣,但他的方法比我的簡單,也容易理解。
我相信,實現(xiàn)該需求的方法不局限于這2種,歡迎各位看官提出更多的解題方法。
(本文完)