2013-04-20 62 views
0

我試圖選擇一羣患者與他們的單位和師,我想按單位名稱將結果分組,但是這個代碼並沒有執行,並且給出了這個問題的主題。列在選擇列表中無效,因爲它不包含在聚合函數或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

回答

0

- 它應該是存在於SELECT語句作爲列。如果您不想將其包含在GROUP BY中,請將其用作SELECT中的AGGREGATE列。

所以,現在在你的情況下,你的問題中陳述的第二個GROUP BY將工作。

閱讀更多地瞭解GROUP BY

1

首先,請不要使用TOP (100) PERCENT;它甚至會傷害閱讀。

其次,您的查詢不包含聚合函數,例如SUMCOUNT。當你說你想「按單位名稱分組」時,我懷疑你可能只想按單位名稱排序結果。在這種情況下,您需要改爲ORDER BY。 (來自其他人的建議是研究group by所做的工作。)

最後,根據您的DBMS,最終可能不需要那些CONVERT函數。

相關問題