簡體   English   中英

是否可以在SQL的聚合函數中包含未聚合的列,而不將其放入GROUP BY子句中?

[英]Can I include a non-aggregated Column in an aggregate function in SQL without putting it into a GROUP BY clause?

取得下表...

Classes
ClassId ClassName
1       Math
2       Math
3       Science
4       Music

Registrations
RegistrationId ClassId StudentName
1              1       Stu
2              1       Rick
3              2       John
4              4       Barb
5              4       Dan
6              3       Einstein

是的,有兩個類在不同的時間具有相同的名稱(數學)。 我想獲得一份課程列表以及每門課程注冊的學生人數。 我想要以下幾列(ClassId,ClassName,StudentCount)。

我對此的嘗試將類似於...

SELECT Classes.ClassId, Classes.ClassName, Count(Registrations.RegistrationId)
FROM Classes
INNER JOIN Registrations ON Classes.ClassId = Registrations.ClassId
GROUP BY Classes.ClassId

(請注意,我想使用ClassId而不是ClassName進行分組)。 在SQLServer 2008中可能嗎? 顯然我問是因為SQL抱怨

"ClassName is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause."

謝謝!

不可以,SQL Server不允許您省略GROUP BY中未包裝在聚合函數中的列。 包含類名沒有什么害處,因為group by將在group by列的組合上執行:

  SELECT c.classid, 
         c.classname, 
         COUNT(r.registrationid)
    FROM CLASSES c
    JOIN REGISTRATIONS r ON r.classid = c.classid
GROUP BY c.classid, c.classname

您可以使用以下方法基於計數派生一個表:

  SELECT c.classid, 
         c.classname, 
         r.num
    FROM CLASSES c
    JOIN (SELECT t.classid,
                 COUNT(*) AS num
            FROM REGISTRATIONS t
        GROUP BY t.classid) r ON r.classid = c.classid

在GROUP BY語句中包含Classes.ClassName應該不會有任何危害。 您將按照ClassId和ClassName的不同對進行分組,因此(1,'Math')和(2,'Math')仍然是兩個不同的分組。

您可以將ClassName放在group by子句中,這是可以的,因為它是與ClassID一對一的:

從類INNER JOIN中選擇Classes.ClassId,Classes.ClassName,Count(Registrations.RegistrationId)進行注冊ON Classes.ClassId = Registrations.ClassId GROUP BY Classes.ClassId,Classes.ClassName

或在select子句中放入MAX(ClassName)。 任一種都會產生相同的結果。

不,你不能:這是一個矛盾。

GROUP BY =折疊為離散值。 如果您不崩潰,則需要對其進行匯總。

碰巧的是,由於ClassName取決於ClassID,因此無論如何您都會得到相同的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM