Sql server 按一列进行SQL分组

Sql server 按一列进行SQL分组,sql-server,group-by,distinct,Sql Server,Group By,Distinct,我试图合并两个表中的列,并使其在删除重复名称的同时,在每行上只显示唯一的名称(全名)。我使用了selectdistinct,它在一定程度上起作用,但它为每个文件显示了唯一的名称(文件ID)。这仍然给我留下了作为一个整体的重复 我最初更喜欢使用GROUPBY,但它给出了一个错误“每个GROUPBY表达式必须至少包含一个非外部引用的列”。我不知道这是什么意思 抱歉,如果这很简单,但我只是开始学习SQL SELECT DISTINCT TOP 3000 p.FileDateID as "Fil

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

我最初更喜欢使用GROUPBY,但它给出了一个错误“每个GROUPBY表达式必须至少包含一个非外部引用的列”。我不知道这是什么意思

抱歉,如果这很简单,但我只是开始学习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

;
我最初更喜欢使用GROUPBY,但它给出了一个错误“每个GROUPBY表达式必须至少包含一个非外部引用的列”。我不知道这是什么意思

这个错误实际上准确地解释了你的问题是什么,以及为什么你的方法有缺陷。它试图告诉您,您只能选择分组依据的字段,其他所有内容都必须删除或聚合

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

因此,您需要做的是准确地计算出您想要从数据库中获取哪些数据,因为如果您确实想要ID,那么您将获得每一行。如果您只需要不同的名称,请适当地为查询添加单词,并使用
分组依据

最后一点是:

ORDER BY
    4 ASC

现在你只是傻了。

假设我们将得到结果表中其余列的唯一名称和最小值。 如果给定全名的任何其他列中有超过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
;

您可以按多个字段分组
按(字段1、字段2)分组
。您的select
P.LastName
中还有一个大写字母P。请再次使用GroupBy子句,并确保在GroupBy子句中使用的列在列名之前附加了表名或别名。group by子句中的不明确列是“每个group by表达式必须至少包含一个非外部引用的列”的来源。错误。这正是我所需要的,非常感谢!我整天都在想办法。