具有重复id的组合在sql中必须是唯一的

具有重复id的组合在sql中必须是唯一的,sql,sql-server,tsql,stored-procedures,sql-server-2012,Sql,Sql Server,Tsql,Stored Procedures,Sql Server 2012,我有一个带有员工ID、账号、账户类型、银行ID和其他一些列的BonuPay表 我需要编写在sql中返回非唯一员工ID的查询 重复的员工ID+账号+银行ID+账户类型。组合必须是唯一的 我编写查询以查找重复的员工ID (SELECT [Employee ID],COUNT([Employee ID]) FROM [BASEP1].[INTERIM - Bonus Pay Election Enrollment] GROUP BY [Employee ID] HAVING COUNT([Emp

我有一个带有员工ID、账号、账户类型、银行ID和其他一些列的BonuPay表

我需要编写在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)
请帮助我如何进一步进行

桌子 **员工ID账号银行ID账号账户类型 DC21002 1042044011 121000358 SA DC21004 8840215401 271070801 DDA DC21005 9942011555 21000089多哈发展议程 DC21106 0033384728空DDA DC21117空121000358 SA DC21053 0448921114 11000138空 DC21003 4505120541 121000248多哈发展议程 DC21007 5981285871 121000358 SA DC21095 5400147754 121000358 SA DC21095 0035793301 121000358 DDA DC21044 0493540121 121000248 SA DC21039空值

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

select [Employee ID]+[Account Number]+[Bank ID Number]+[Account Type]
from [BASEP1].[INTERIM - Bonus Pay Election Enrollment]
DC21002044011121000358SA DC210048804215401271070801DDA DC2100599420155521000089DDA DC211117NULL121000358SA
现在检查此结果组合是否唯一

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

;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]

如果我理解正确,请纠正我,如果我错了,那么您希望找到员工ID+账号+银行ID+账户类型组合的副本,然后只需对其进行分组即可。这将在员工ID+账号+银行ID+账户类型的uniq组合上进行分组


如果要查找重复的行,可以尝试以下方法:

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

为什么那句话不起作用

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

;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

您可以在“选择和分组依据”中添加其他字段。您可以向我们展示一些输入和预期输出的示例数据吗?BonuPay表Employee IDOk nvm。我不知道你想选择多个列。就像其他人提到的那样,只需要重复Emp ID,然后与其他列连接帐号、银行ID、,帐户类型。生成的字符串应该是唯一的。我得到以下错误:每个GROUP BY表达式必须至少包含一个非外部引用的列。我几乎不使用MS SQL。我不确定是否支持按列分组引用。我刚刚删除了引用组by 1,2,3,4并添加了列名。错误:函数“ROW_NUMBER”必须有一个带有ORDER by的OVER子句。
;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