【问题标题】:Create deduplicated string from multiple columns in SQL从 SQL 中的多列创建去重字符串
【发布时间】:2021-05-05 08:14:26
【问题描述】:

我们有一个人力资源系统,其中人员被分配到多达 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'

【问题讨论】:

  • 当然,我的错。我更新了信息,它在 MS-SQL 2017 上运行。

标签: sql duplicates sql-server-2017


【解决方案1】:

我使用IIF 运算符找到了解决方案。

SELECT 
    IIF(LEFT(OrgLvl1, 1) = 1, OrgLvl1 + '; ', '') + 
    IIF(LEFT(OrgLvl2, 1) = 2, OrgLvl2 + '; ', '') +
    IIF(LEFT(OrgLvl3, 1) = 3, OrgLvl3 + '; ', '') +
    IIF(LEFT(OrgLvl4, 1) = 4, OrgLvl4 + '; ', '') +
    IIF(LEFT(OrgLvl5, 1) = 5, OrgLvl5 + '; ', '') +
    IIF(LEFT(OrgLvl6, 1) = 6, OrgLvl6 + '; ', '') +
    IIF(LEFT(OrgLvl7, 1) = 7, OrgLvl7 + '; ', '') AS 'OrgString'
FROM tableName

DB FIDDLE上的演示

【讨论】:

  • 谢谢!这就是我需要的提示。经过一些修改,我得到了我想要的方式。
  • 欢迎您@KriKul。然后请赞成我的回答并接受它。最好的问候。
【解决方案2】:

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

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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2020-05-16
    • 2016-07-09
    • 2023-03-11
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多