Sql 列在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中
我试着选择一组有他们单位和部门的患者,我想按单位名称对结果进行分组,但是这段代码没有执行,并且给出了错误作为这个问题的主题Sql 列在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中,sql,sql-server,group-by,Sql,Sql Server,Group By,我试着选择一组有他们单位和部门的患者,我想按单位名称对结果进行分组,但是这段代码没有执行,并且给出了错误作为这个问题的主题 SELECT TOP (100) PERCENT Pat.PatName AS Name, srvDiv.sgMType AS Perkhidmatan, Pat.PatMRank AS Pangkat, Pat.PatMilitaryID AS [No# Tentera], unt.untName AS Unit, f
SELECT TOP (100) PERCENT
Pat.PatName AS Name,
srvDiv.sgMType AS Perkhidmatan,
Pat.PatMRank AS Pangkat,
Pat.PatMilitaryID AS [No# Tentera],
unt.untName AS Unit,
fct.pesStatusCode as StatusCode,
fct.pesSignedDate AS SignedDate
FROM dbo.FactPES AS fct INNER JOIN
dbo.DimPatient AS Pat ON fct.pesPatID = Pat.PatID LEFT OUTER JOIN
dbo.DimUnit AS unt ON fct.pesUnitID = unt.untID LEFT OUTER JOIN
dbo.DimServiceDiv AS srvDiv ON fct.pesServiceDivID = srvDiv.sgID
GROUP BY unt.untName
HAVING (deas.diDate BETWEEN
CONVERT(DATETIME, @FromDate, 102)
AND
CONVERT(DATETIME, @ToDate, 102))
我想这是因为unt.UntName在我的左连接中,所以我不能在连接之外使用它,也许?我有点困惑,因为当我这样说时,它是有效的:
GROUP BY unt.untName, Pat.PatName, srvDiv.sgMType,
Pat.PatMRank, Pat.PatMilitaryID, unt.untName,
fct.pesStatusCode, fct.pesSignedDate
无论何时使用“分组依据”,我们都非常感谢您的帮助-它应该作为一列出现在
选择语句中。如果您不想将其包含在分组中,请将其用作中的聚合列,然后选择
因此,在您的案例中,您问题中所述的第二个分组将起作用
阅读此文章了解更多关于的信息。首先,请不要使用TOP(100%)
;甚至看书都会痛
其次,您的查询不包含聚合函数,例如,不包含SUM
或COUNT
。当你说你想“按单元名分组”时,我怀疑你可能只是想让结果按单元名排序。在这种情况下,您需要的是按
排序。(其他人的建议是研究groupby
的作用。)
最后,根据您的DBMS,您可能不需要在最后使用那些CONVERT
函数 “我想按单元名称对结果进行分组”-我认为您没有理解groupby
在SQL中的作用:这意味着您将只为每个唯一的分组值返回一行-因此,如果按单元名称分组,则无论有多少患者属于该单元,每个单元只会得到一行。你到底想做什么?