2015-02-11 54 views
0

我有一张带有员工ID,账户号码,账户类型,银行ID和一些其他列的BonusPay表。带有重复ID的组合必须在sql中是唯一的

我需要编写查询其在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帐号银行识别号帐户类型
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
现在检查这导致组合是唯一的或不

+0

你在那里添加其他领域的选择和分组依据。 – 2015-02-11 08:43:32

+0

您能向我们展示您的输入和预期输出的一些示例数据吗? – Dan 2015-02-11 08:43:39

+0

BonusPay表员工ID – 2015-02-11 09:31:02

回答

0

把你的查询识别复制到一个公共表表达式,然后将您的重复值加入您的原始表格以获得您的结果。

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

如果我理解正确的话,你(纠正我,如果我错了),那么你要找到组合Employee ID+Account Number+Bank ID+Account Types的副本,然后只是做它的组。这将做的Employee ID+Account Number+Bank ID+Account Types

;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 
+0

只取出重复的Emp ID,然后连接到其他列帐户号码,银行ID,帐户类型。结果字符串应该是唯一的。 – 2015-02-11 09:37:13

+0

检查更新。 – 2015-02-11 10:17:21

0

的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 
+0

我得到这个错误:''每个GROUP BY表达式都必须包含至少一个不是外部引用的列'' – 2015-02-11 09:45:07

+0

我几乎不使用MS SQL。我不确定是否支持按列引用。我刚刚删除了引用(由1,2,3,4组),并添加了列名。 – badzong 2015-02-11 10:25:53

0

为什么没有这种说法做的工作?:

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

Ok nvm。我没有让你想选择多个列。就像其他人提到的一样。 – Clevemayer 2015-02-11 09:08:01

0

这是怎么回事?

;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 
+0

错误:''函数'ROW_NUMBER'必须有ORDER BY的OVER子句。'' – 2015-02-12 07:10:59

+0

@KSushma,我已经更正了。 – KumarHarsh 2015-02-16 04:07:30

相关问题