列在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中

时间:2013-04-20 09:11:38

标签: 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,
    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

感谢任何帮助

2 个答案:

答案 0 :(得分:1)

首先,请不要使用TOP (100) PERCENT;甚至阅读也很痛。

其次,您的查询不包含聚合函数,例如,不包含SUMCOUNT。当你说你想“按单位名称分组”时,我怀疑你可能只是希望按单位名称排序结果。在这种情况下,您需要ORDER BY。 (其他人研究group by做什么的建议很好。)

最后,根据您的DBMS,您可能最终不需要那些CONVERT函数。

答案 1 :(得分:0)

每当您使用GROUP BY时,它应作为列存在于SELECT语句中。如果您不希望将其包含在GROUP BY中,请将其用作AGGREGATE中的SELECT列。

现在,在你的情况下,你问题中陈述的第二个GROUP BY将起作用。

阅读本文以了解有关GROUP BY

的更多信息