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

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

问题描述:

我试图选择一群患者与他们的单位和师,我想按单位名称将结果分组,但是这个代码并没有执行,并且给出了这个问题的主题。列在选择列表中无效,因为它不包含在聚合函数或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

GROUP BY unt.untName, Pat.PatName, srvDiv.sgMType, 
    Pat.PatMRank, Pat.PatMilitaryID, unt.untName, 
    fct.pesStatusCode, fct.pesSignedDate 

任何帮助表示赞赏

+1

“我想按单元名称对结果进行分组” - 我认为你无法理解SQL中的“group by”的作用:这意味着对于每个唯一的分组值,只会返回一行 - 所以如果将group按单位名称,每个单位只能得到一行,**无论该单位有多少个病人**。你究竟在做什么*尝试*做什么? – 2013-04-20 09:29:59

- 它应该是存在于SELECT语句作为列。如果您不想将其包含在GROUP BY中,请将其用作SELECT中的AGGREGATE列。

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

阅读更多地了解GROUP BY

首先,请不要使用TOP (100) PERCENT;它甚至会伤害阅读。

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

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