2013-06-20 48 views
6

我有几个记录(票据),它们基本上彼此的副本,除了一个字段,它表示纸币是在语言筛选重复行

,例如:

ID,BillID,Account,Name,Amount,Lang 
1,0001,abcd,John Smith,10.99,ENG 
2,0002,qwer,Jane Doe,9.99,ENG 
3,0001,abcd,John Smith,10.99,SPA 
4,0003,abcd,John Smith,4.99,CHI 

所有字段都是字符串,ID除外,它是自动编号。

在我的SQL选择,我有

SELECT * 
FROM Bills 
WHERE Account='abcd' 

并返回总共3行,但两行对同一议案。我需要为特定帐户返回唯一帐单。所以在上面的场景中,我想要检索两张billID 0003和SPA或ENG版本0001的账单,但不是两种。

查询会是什么?

谢谢

编辑:我不能依赖于特定的语言总是在那里。例如,我不能说SELECT * FROM Bills WHERE Account='abcd' AND Lang='ENG',因为有时账单可能只有一种语言,而不是ENG,有时可能以几种语言以任意组合。

+0

您想在什么基础上选择要使用的语言?按字母顺序?账单ID - 最低还是最高?帐户语言?还有别的吗? –

+0

没有特别优选。我需要得到一张处理账单,而不是查看。当我们使用PDF格式呈现账单时,语言只会起作用,但处理账单时,语言无关紧要。 – George

回答

9

也许最简单的方法是使用ROW_NUMBERPARTITION BY

SELECT * FROM (
    SELECT b.*, 
    ROW_NUMBER() OVER (PARTITION BY BillID ORDER BY Lang) as num 
    FROM Bills b 
    WHERE Account = 'abcd' 
) tbl 
WHERE num = 1 
+0

我最喜欢这个答案。我从来没有见过这种方法。执行计划表示来自Eric的查询和user2407394的查询成本相同。 – George

7
select 
ID,BillID,Account,Name,Amount,max(Lang) 
FROM Bills 
WHERE Account='abcd' 
group by BillID,Account,Name,Amount; 

鉴于如果多种语言中有相同的账单,您并未优先考虑任何特定语言。上面的查询将工作完美。

编辑:从组中删除“ID”。 @菲尔你是对的..!

3
select 
BillID,Account,Name,Amount,max(Lang) 
FROM Bills 
WHERE Account='abcd' 
group by BillID,Account,Name,Amount; 

相同,只是没有在GROUPBY的ID user2407394,因为这将返回3了。

+0

我认为这个(以及来自@ user2407394的答案)会给出错误,因为如果没有在“group by”中包含它,就不能选择“ID”。 –

+0

@Eric你是对的。我修改了查询以使用Max(ID),该Max(ID)可以工作,但由于MAX(ID)可能并不总是对应于MAX(Lang),所以出现了一些差异。在我的文章中,结果可能是'3,0001,abcd,John Smith,10.99,ENG'因为3> 1和ENG> SPA(我不知道它,但你明白我的观点)。 – George

+0

对不起,我的意思是把这个ID也拿出来。 – Phil