0

我正在尝试选择一组患者及其单位和部门,并且我想按单位名称对结果进行分组,但是此代码不会执行并将错误作为此问题的主题。

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

任何帮助表示赞赏

4

2 回答 2

1

首先,请不要使用TOP (100) PERCENT; 连读书都痛。

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

最后,您可能最终不需要这些CONVERT功能,具体取决于您的 DBMS。

于 2013-04-21T05:45:51.393 回答
0

每当您使用GROUP BY- 时,它都应该作为列出现在SELECT语句中。如果您不想将其包含在 a 中,GROUP BY请将其用作.AGGREGATESELECT

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

阅读本文以了解有关GROUP BY的更多信息

于 2013-04-20T09:17:59.590 回答