2011-01-27 9 views
5

は以下の表を取り、彼らは異なる時間にあってもよいと...集計されていない列をSQLの集計関数にGROUP BY句に含めることなく含めることはできますか?

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 

はい、同じ名前(数学)との2クラスがあります。各クラスに登録されているクラスと受講者のリストを取得したいと思います。私は、次の列(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ではなく、クラス名をGROUPBYしたいと思います)になります。これは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." 

ありがとう!

+0

サブクエリ内のIDと集計カウントだけを選択してから、その名前のテーブルに戻って結合することができます。 – Pointy

答えて

11

いいえ、SQL Serverでは、集計関数でラップされていないGROUP BYの列を省略することはできません。

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 
2
を:

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 

あなたが使用して、集計に基づいてテーブルを導き出すことができます:列によってグループの組み合わせで実行されますによってグループがいるので害は、クラス名を含めてではありません

あなたはそれがのClassIDと1-TO1あるので、[OK]をされる、GROUP BY句でクラス名を置くことができ、次のいずれか

SELECT Classes.ClassId、Classes.ClassName、カウント(Registrations.RegistrationId) のクラスから INN ER JOIN登録Classes.ClassId = Registrations.ClassId GROUP BY Classes.ClassId、Classes.ClassName

またはselect句にMAX(ClassName)を入れます。いずれの場合も同じ結果が得られます。

5

GROUP BY文にClasses.ClassNameを含めても問題ありません。 ClassIdとClassNameの別々のペアでグループ化するので、(1、 'Math')と(2、 'Math')はまだ2つの異なるグループに分かれています。

+0

@OMGポニーと他のすべて...私は両方で(Classes.ClassIdとClasses.ClassName)を保持している限り、グループが正常に動作することを認識するのを手伝ってくれてありがとう。純粋な愚かさの瞬間のなかで、私はClasses.ClassNameだけでなくClasses.ClassIdを含めてみました。それは望ましくないことに、すべての数学をまとめてグループ化しました。私は私のエラーを見て、私を助けてくれてありがとう。 – Justin

1

いいえ、あなたはできません:それは矛盾です。

GROUP BY =離散値に崩壊します。あなたが崩壊しなければ、それを集約する必要があります。

ClassNameがClassIDに依存するため、結果的に同じ結果が得られます。

関連する問題