列 'Csv.FolderId' 在 select 列表中无效,因为它未包含在聚合函数或 GROUP BY 子句中
Column 'Csv.FolderId' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
Table Csv 有很多列,包括 FirstName、Lastname、ProjectName、BuildingNumber 等。我想找到所有具有相同 FirstName-LastName 组合的记录。
但是下面的代码给我错误 Column Csv.ProjectName is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
SELECT *
FROM Csv
GROUP BY FIrstName, Lastname
HAVING COUNT(*) > 1
如何调整代码来修复错误?
错误信息是正确的。您可以在 select 列表中指定 FirstName、LastName。所有其他列都需要是一个聚合。例如,如果地址是 table 中的一列,MAX(Address) 就可以了。 (如果有两条以上的记录,您将不知道 MAX 值来自哪条记录。使用 MAX 或 MIN 会导致一条记录的列值来自不同的记录。所以您不能只选择每一列的 MAX除非逻辑是这样的结果不需要是来自一个特定记录的值。)
一种方法是获取所需内容的“密钥”,然后加入以获取整个记录。 (窗口函数是另一种方法。)
SELECT k.NameCount, c.*
FROM Csv c
INNER JOIN (
SELECT FirstName, Lastname, COUNT(*) as [NameCount]
FROM Csv
GROUP BY FirstName, Lastname
HAVING COUNT(*) > 1
) k
ON k.FirstName = c.FirstName AND k.Lastname = c.Lastname
ORDER BY k.NameCount DESC
Table Csv 有很多列,包括 FirstName、Lastname、ProjectName、BuildingNumber 等。我想找到所有具有相同 FirstName-LastName 组合的记录。
但是下面的代码给我错误 Column Csv.ProjectName is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
SELECT *
FROM Csv
GROUP BY FIrstName, Lastname
HAVING COUNT(*) > 1
如何调整代码来修复错误?
错误信息是正确的。您可以在 select 列表中指定 FirstName、LastName。所有其他列都需要是一个聚合。例如,如果地址是 table 中的一列,MAX(Address) 就可以了。 (如果有两条以上的记录,您将不知道 MAX 值来自哪条记录。使用 MAX 或 MIN 会导致一条记录的列值来自不同的记录。所以您不能只选择每一列的 MAX除非逻辑是这样的结果不需要是来自一个特定记录的值。)
一种方法是获取所需内容的“密钥”,然后加入以获取整个记录。 (窗口函数是另一种方法。)
SELECT k.NameCount, c.*
FROM Csv c
INNER JOIN (
SELECT FirstName, Lastname, COUNT(*) as [NameCount]
FROM Csv
GROUP BY FirstName, Lastname
HAVING COUNT(*) > 1
) k
ON k.FirstName = c.FirstName AND k.Lastname = c.Lastname
ORDER BY k.NameCount DESC