国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

將一列中多行相同的值只顯示在一行

2024-07-21 02:46:22
字體:
來源:轉載
供稿:網友
將一列中多行相同的值只顯示在一行

數據庫環境: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種,歡迎各位看官提出更多的解題方法。

(本文完)


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 贺州市| 岳阳县| 鲁甸县| 三原县| 资中县| 井陉县| 方城县| 名山县| 吴堡县| 广水市| 崇文区| 萍乡市| 喜德县| 新津县| 凌源市| 荣昌县| 太仓市| 汝城县| 咸丰县| 会理县| 务川| 许昌市| 文登市| 城口县| 华阴市| 上蔡县| 右玉县| 镇平县| 十堰市| 大新县| 萨嘎县| 阿勒泰市| 龙江县| 平原县| 姜堰市| 牡丹江市| 正定县| 林州市| 平谷区| 临朐县| 泽库县|