首页 > 解决方案 > 从 SQL 中的多列创建去重字符串

问题描述

我们有一个人力资源系统,其中人员被安排在多达 7 个不同的组织级别。每个级别都显示在数据库中自己的列中(在 MS-SQL 2017 上运行)我想创建一个组织字符串,显示组织中的人员位置。但是 HR 系统正在重复值列与前一个值以填充所有列,因此如果我只是将这些值与一个简单的函数组合起来,那么字符串中充满了重复项,这样对于字符串的使用者来说不是很有用:

SELECT [OrgLvl1] + ';' + [OrgLvl2] + ';' + [OrgLvl3] + ';' + [OrgLvl4] + ';' + [OrgLvl5] + ';' + [OrgLvl6] + ';' + [OrgLvl7] as 'OrgString'

数据样本可能如下所示:

    |-----------+-----------+-----------+-----------+-----------+-----------+-----------|
    | OrgLvl1   | OrgLvl2   | OrgLvl3   | OrgLvl4   | OrgLvl5   | OrgLvl6   | OrgLvl7   |
    |-----------+-----------+-----------+-----------+-----------+-----------+-----------|
    | 1stLevel  | 2ndLevel  | 2ndLevel  | 2ndLevel  | 5thLevel  | 6thLevel  | 7thLevel  |
    | 1stLevel  | 2ndLevel  | 2ndLevel  | 4thLevel  | 5thLevel  | 6thLevel  | 6thLevel  |
    | 1stLevel  | 2ndLevel  | 2ndLevel  | 4thLevel  | 5thLevel  | 6thLevel  | 7thLevel  |
    |-----------+-----------+-----------+-----------+-----------+-----------+-----------|

我得到的结果是

   1stLevel;2ndLevel;2ndLevel;2ndLevel;5thLevel;6thLevel;7thLevel
   1stLevel;2ndLevel;2ndLevel;4thLevel;5thLevel;6thLevel;6thLevel
   1stLevel;2ndLevel;2ndLevel;4thLevel;5thLevel;6thLevel;7thLevel

我想要的结果是这样的:

    1stLevel;2ndLevel;5thLevel;6thLevel;7thLevel
    1stLevel;2ndLevel;4thLevel;5thLevel;6thLevel
    1stLevel;2ndLevel;4thLevel;5thLevel;6thLevel;7thLevel

所以我正在寻找一些方法来查看字符串中的前一个值并消除任何重复项。

更新:我用这个:

IIF([OrgLvl2] != [OrgLvl1], [OrgLvl2] + ';', '') +
IIF([OrgLvl3] != [OrgLvl2], [OrgLvl3] + ';', '') +
IIF([OrgLvl4] != [OrgLvl3], [OrgLvl4] + ';', '') +
IIF([OrgLvl5] != [OrgLvl4], [OrgLvl5] + ';', '') +
IIF([OrgLvl6] != [OrgLvl5], [OrgLvl6] + ';', '') +
IIF([OrgLvl7] != [OrgLvl6], [OrgLvl7] + ';', '') AS 'OrgString'

标签: sqlduplicatessql-server-2017

解决方案


看看以前的,你可以这样做: -

OrgLvl1 + ';' +
IIF(OrgLvl2 <> OrgLvl1, OrgLvl2 + ';', '') +
IIF(OrgLvl3 <> OrgLvl2, OrgLvl3 + ';', '') +
IIF(OrgLvl4 <> OrgLvl3, OrgLvl4 + ';', '') + 
IIF(OrgLvl5 <> OrgLvl4, OrgLvl5 + ';', '') +
IIF(OrgLvl6 <> OrgLvl5, OrgLvl6 + ';', '') +
IIF(OrgLvl7 <> OrgLvl6, OrgLvl7 + ';', '') 
AS 'OrgString'

推荐阅读