我正在尝试用他们的单位和分区选择一堆患者,我想按单位名称对结果进行分组,但是这段代码没有执行,并将错误作为这个问题的主题。
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
感谢任何帮助
答案 0 :(得分:1)
首先,请不要使用TOP (100) PERCENT
;甚至阅读也很痛。
其次,您的查询不包含聚合函数,例如,不包含SUM
或COUNT
。当你说你想“按单位名称分组”时,我怀疑你可能只是希望按单位名称排序结果。在这种情况下,您需要ORDER BY
。 (其他人研究group by
做什么的建议很好。)
最后,根据您的DBMS,您可能最终不需要那些CONVERT
函数。
答案 1 :(得分:0)
每当您使用GROUP BY
时,它应作为列存在于SELECT
语句中。如果您不希望将其包含在GROUP BY
中,请将其用作AGGREGATE
中的SELECT
列。
现在,在你的情况下,你问题中陈述的第二个GROUP BY
将起作用。
阅读本文以了解有关GROUP BY
的更多信息