【问题标题】:combination with duplicate id must be unique in sql与重复id的组合在sql中必须是唯一的
【发布时间】:2015-02-11 08:41:37
【问题描述】:

我有一个 BonusPay 表,其中包含员工 ID、帐号、帐户类型、银行 ID 和其他一些列。

我需要编写在 sql 中返回非唯一员工 ID 的查询

重复的员工 ID+帐号+银行 ID+帐户类型。组合必须是唯一的。

我写了查询来查找重复的员工 ID

(SELECT [Employee ID],COUNT([Employee ID]) 
FROM [BASEP1].[INTERIM - Bonus Pay Election Enrollment] 
GROUP BY [Employee ID] 
HAVING COUNT([Employee ID])>1)

请帮助我如何进行下一步

表 **员工身份证号 银行身份证号 账户类型
DC21002 1042044011 121000358 SA
DC21004 8840215401 271070801 DDA
DC21005 9942011555 21000089 DDA
DC21106 0033384728 NULL DDA
DC21117 NULL 121000358 SA
DC21053 0448921114 11000138 NULL
DC21003 4505120541 121000248 DDA
DC21007 5981285871 121000358 SA
DC21095 5400147754 121000358 SA
DC21095 0035793301 121000358 DDA
DC21044 0493540121 121000248 SA
DC21039 NULL NULL NULL

现在取重复的 ID,与其他列结合。 结果看起来像

select [Employee ID]+[Account Number]+[Bank ID Number]+[Account Type]
from [BASEP1].[INTERIM - Bonus Pay Election Enrollment]

DC210021042044011121000358SA
DC210048840215401271070801DDA
DC21005994201155521000089DDA
DC21117NULL121000358SA
现在检查这个结果组合是否唯一

【问题讨论】:

  • 您在那里将其他字段添加到选择和分组依据。
  • 您能否向我们展示一些您的输入和预期输出的示例数据?
  • BonusPay 表员工 ID

标签: sql sql-server tsql stored-procedures sql-server-2012


【解决方案1】:

将识别重复项的查询放入公用表表达式中,然后将重复值加入原始表以获得结果。

;with CTE as
(SELECT [Employee ID],COUNT([Employee ID]) 
FROM [BASEP1].[INTERIM - Bonus Pay Election Enrollment] 
GROUP BY [Employee ID] 
HAVING COUNT([Employee ID])>1)
select distinct employee ID
from [BASEP1].[INTERIM - Bonus Pay Election Enrollment] b
join cte a on a.[employee id] on b.[employee id]

【讨论】:

    【解决方案2】:

    为什么那句话不起作用?:

    SELECT [Employee ID]
        FROM [BASEP1].[INTERIM - Bonus Pay Election Enrollment] 
        GROUP BY [Employee ID] 
        HAVING COUNT([Employee ID])>1;
    

    【讨论】:

    • 好的 nvm。我没有让你想选择多个列。就像其他人提到的那样去做。
    【解决方案3】:

    如果我理解正确(如果我错了,请纠正我)然后你想找到组合 Employee ID+Account Number+Bank ID+Account Types 的重复项,然后按它进行分组。这将对Employee ID+Account Number+Bank ID+Account Types的uniq组合进行分组

        ;WITH CTE
          (
           SELECT [Employee ID],COUNT([Employee ID]) as duplicatecount
           FROM [BASEP1].[INTERIM - Bonus Pay Election Enrollment] 
           GROUP BY [Employee ID]
           HAVING COUNT([Employee ID])>1
          )
        Select c.EmployeeID,
               t.AccountNumber,
               t.BankID,
               t.AccountType
        FROM
            CTE c Join [BASEP1].[INTERIM - Bonus Pay Election Enrollment] t
             ON c.EmployeeID = t.EmployeeID
    

    【讨论】:

    • 只取重复的 Emp ID,然后与其他列 Account Number,Bank ID,Account Types 连接。结果字符串应该是唯一的。
    【解决方案4】:

    如果你想找到重复的行,你可以试试这个:

    SELECT
        [Employee ID],
        [Account Number],
        [Bank ID],
        [Account Types],
        COUNT(*)
    FROM
        [BASEP1].[INTERIM - Bonus Pay Election Enrollment] 
    GROUP BY
        [Employee ID],
        [Account Number],
        [Bank ID],
        [Account Types]
    HAVING
        COUNT(*) > 1
    

    【讨论】:

    • 我得到这个错误:''每个 GROUP BY 表达式必须至少包含一个不是外部引用的列。''
    • 我几乎不使用 MS SQL。我不确定是否支持按列引用分组。我刚刚删除了引用(按 1、2、3、4 分组)并添加了列名。
    【解决方案5】:

    这个呢?

    ;WITH CTE
    AS (
        SELECT *
            ,ROW_NUMBER() OVER (
                PARTITION BY [Employee ID]
                ,[Account Number]
                ,[Bank ID]
                ,[Account Types]
                order by [Employee ID]    
                ) ROWNUM
        FROM [BASEP1].[INTERIM - Bonus Pay Election Enrollment]
        )
    SELECT *
        ,[Employee ID] + [Account Number] + [Bank ID] + [Account Types] + ROWNUM AS [New Employee ID]
    FROM CTE
    

    【讨论】:

    • error:''函数'ROW_NUMBER'必须有一个带有ORDER BY的OVER子句。''
    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    相关资源
    最近更新 更多