2011-11-07 38 views
1

我有一个(相当脏)的数据源(excel),看起来像这样:sql“group by”相同的PersonID,不同的PersonNames。消除重复

ID |名称|主题|等级
123 |史密斯,乔R. | MATH | 2.0
123 |史密斯,乔罗德里格斯|法语| 3.0
234 | Doe,Mary Jane D. |生物学| 2.5
234 | Doe,Mary Jane Dawson |化学| 2.5
234 | Doe,Mary Jane |法语| 3.5

我的应用程序的输出应该是这样的:

Smith, Joe R. 
123 

MATH | 2.0 
FRENCH | 3.0 

所以基本上我想要做的查询(只是为ID /人父 '容器')是这样的:

SELECT DISTINCT ID, Name FROM MyTable<br/> 


SELECT ID, Name FROM MyTable GROUP BY ID 


当然b的以上的其中一项是无效的,将不起作用。


我想“结合”相同的ID并忽略/截断具有相同ID /不同名称的其他记录(因为我们都知道它们是同一个人,因为ID是我们的标识符,显然它只是一个错字/脏数据)。

这可以通过一个单一的SELECT查询吗?

+0

有你的问题标签是他们的一部分的输入/输出或试图格式化这个问题? – Mark

回答

1

的MIN或MAX值如果你真的不关心它的值在名称字段显示出来,用MAX()MIN()

SELECT ID, 
      MAX(Name) AS Name 
FROM  [YourTable] 
GROUP BY ID 

这里的一个可玩的例子:http://data.stackexchange.com/stackoverflow/q/116699/

+0

谢谢。工作。我忘了我需要按名称订购。我只是四处搜索,发现我实际上可以使用“ORDER BY 2”,它应该是一个不赞成使用的语法(尽管) –

0

你可以找到名称

SELECT ID, Max(Name) 
FROM MyTable 
GROUP BY ID 
0
SELECT A.ID, A.NAME, T.Subject, T.Grade 
FROM (SELECT ID, MIN(NAME) AS NAME 
     FROM MyTable 
     GROUP BY ID) A 
LEFT JOIN MyTable T on A.ID = T.ID 

会给你像

123 Smith, Joe R.  Math  2.0 
123 Smith, Joe R.  FRENCH 3.0 
234 Doe, Mary Jane BIOLOGY 2.5 
234 Doe, Mary Jane CHEMISTRY 2.5 
234 Doe, Mary Jane FRENCH 3.5 
0

如果你不关心它的名字你留着,你可以使用一个MAX()MIN()合计只选择一个名字:

SELECT ID, MAX(Name) as Name 
FROM MyTable GROUP BY ID