SQL分组由一列组成

时间:2015-11-03 17:45:57

标签: sql-server group-by distinct

我尝试组合两个表中的列,并且只删除重复的名称时,每行只显示唯一的名称(全名)。我使用了SELECT DISTINCT,它在一定程度上起作用,但它为每个(文件ID)显示唯一的名称。这仍然留下了重复的整体。

我最初使用的是GROUP BY,但是它会给出错误"每个group by expression必须包含至少一个不是外部引用的列。"我不知道这意味着什么。

很抱歉,如果这很简单,但我刚刚开始学习SQL!

SELECT DISTINCT TOP 3000
    p.FileDateID as "File ID", 
    p.CategoryID as "Category ID", 
    fd.OrganizationID as "Organization"
    concat(p.FirstName, p.MiddleName, P.LastName) as "Full Name"
    p.FirstName as "First Name", 
    p.MiddleName as "Middle Name", 
    p.LastName as "Last Name",
    p.Title, 
    p.Street, 
    p.City, 
    p.State, 
    p.Zip, 
    p.WorkPhone as "Work Phone", 
    p.MobilePhone as "Mobile Phone", 
    p.EMail

FROM 
    byte.dbo.Party p

INNER JOIN
    byte.dbo.FileData fd ON fd.FileDataID = p.FileDataID

#   GROUP BY
#   5

ORDER BY
    4 ASC

;

2 个答案:

答案 0 :(得分:1)

  

我最初使用的是GROUP BY,但是它会给出错误"每个group by expression必须包含至少一个不是外部引用的列。"我不知道这意味着什么。

该错误实际上解释了您的问题究竟是什么,以及为什么您的方法存在缺陷。它试图告诉您,您只能选择分组的字段,其他所有内容都必须删除或汇总。

而这正是需要发生的事情,因为你抱怨说如果你绕过分组机制并试图超越"智取"你得到重复的行,因为文件ID是不同的 - 当然它们是不同的,这使得整行成为一个新行。分组会阻止完全选择该字段。

所以你需要做的就是弄清楚你想要从数据库中得到什么数据,因为如果你真的想要这些ID,那么你就会得到每一行。如果您只想要不同的名称,请恰当地使用group by

最后一点,这是:

ORDER BY
    4 ASC

现在你只是愚蠢。

答案 1 :(得分:1)

我们假设我们将获得唯一的名称以及结果表中其余列的最小值(值)。 如果给定全名的任何其他列中的值超过1,我们将看到列中返回的最低值。 如果给定全名的其他列中只有1个值,那么min()是微不足道的,我们将看到为该列返回的一个值

SELECT DISTINCT TOP 3000
   min(p.FileDateID) as "File ID", 
   min(p.CategoryID) as "Category ID", 
   min(fd.OrganizationID) as "Organization"
   concat(p.FirstName, p.MiddleName, p.LastName) as "Full Name"
   min(p.FirstName) as "First Name", 
   min(p.MiddleName) as "Middle Name", 
   min(p.LastName) as "Last Name",
   min(p.Title) as Title,    
   min(p.Street) as Street, 
   min(p.City) as City, 
   min(p.State) as State, 
   min(p.Zip) as Zip, 
   min(p.WorkPhone) as "Work Phone", 
   min(p.MobilePhone) as "Mobile Phone", 
   min(p.EMail) as Email
FROM 
   byte.dbo.Party p
INNER JOIN
   byte.dbo.FileData fd ON fd.FileDataID = p.FileDataID
GROUP BY
   concat(p.FirstName, p.MiddleName, p.LastName)
ORDER BY 4 ASC
;
相关问题