列在选择列表中无效,因为它不包含在聚合函数或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
任何帮助表示赞赏
答
- 它应该是存在于SELECT
语句作为列。如果您不想将其包含在GROUP BY
中,请将其用作SELECT
中的AGGREGATE
列。
所以,现在在你的情况下,你的问题中陈述的第二个GROUP BY
将工作。
阅读更多地了解GROUP BY
答
首先,请不要使用TOP (100) PERCENT
;它甚至会伤害阅读。
其次,您的查询不包含聚合函数,例如SUM
或COUNT
。当你说你想“按单位名称分组”时,我怀疑你可能只想按单位名称排序结果。在这种情况下,您需要改为ORDER BY
。 (来自其他人的建议是研究group by
所做的工作。)
最后,根据您的DBMS,最终可能不需要那些CONVERT
函数。
“我想按单元名称对结果进行分组” - 我认为你无法理解SQL中的“group by”的作用:这意味着对于每个唯一的分组值,只会返回一行 - 所以如果将group按单位名称,每个单位只能得到一行,**无论该单位有多少个病人**。你究竟在做什么*尝试*做什么? – 2013-04-20 09:29:59