2017-10-24 20 views
0

私たちのスタッフのそれぞれが教える予定のクラスの数を見つけようと思っていますが、私はそのstaffIDがスケジュールテーブルに現れた回数を数えました。スタッフの最初の名前ですが、何らかの理由で姓と名を連結して割り当てられた別名でグループ化しようとすると機能しません。私は間違って何をしていますか?エイリアスをGROUP BYする方法

SELECT DISTINCT sf.StfFirstName + ' ' + sf.StfLastname As StaffName, COUNT(fc.StaffID) 
FROM Staff sf 
JOIN Faculty_Classes fc 
ON sf.StaffID = fc.StaffID 
join Classes cl 
ON fc.ClassID = cl.ClassID 
GROUP BY Sf.StaffName 
+0

ああ。 ** group byを既に使用している単一のクエリに 'distinct distinct'を含めてはいけません**。グループの下の私の答えで述べたように、選択前に実行され、それは別個のものの前に実行されます。 ** GROUP BYは一意の行を作成する**ので、すでに一意の行が「別個」であることを尋ねることは、時間と労力の純粋な無駄です。 –

答えて

3

select句で使用されているロジックを繰り返すだけです。非効率に見えるかもしれませんが、そうではありません。注:group by節に貼り付ける場合、そのロジックに与えられたエイリアスは省略してください。

SELECT sf.StfFirstName + ' ' + sf.StfLastname As StaffName, 
COUNT(fc.StaffID) 
FROM Staff sf 
JOIN Faculty_Classes fc 
    ON sf.StaffID = fc.StaffID 
join Classes cl 
    ON fc.ClassID = cl.ClassID 
GROUP BY sf.StfFirstName + ' ' + sf.StfLastname 
; 

また、連結なしで試すこともできます。 select句は、実際に他の言葉でSQLクエリを書くのシーケンスは、動作のシーケンスではない、ことで、グループの後に行われますので、select clauseで作成

GROUP BY sf.StfFirstName, sf.StfLastname 

エイリアスはgroup by clauseによって再利用可能ではありません。

0

ユーザーUsed_By_Alreadyが示唆されているようにあなたがロジックを繰り返したりしてくださいあなたの場合は、代わりあなたが共通テーブル式または派生テーブルを使用することができます。

共通テーブル式:

with cte_example -- with name_of_cte as (your query) 
as 
(
SELECT sf.StfFirstName + ' ' + sf.StfLastname As StaffName, COUNT(fc.StaffID) 
FROM Staff sf 
JOIN Faculty_Classes fc 
ON sf.StaffID = fc.StaffID 
join Classes cl 
ON fc.ClassID = cl.ClassID 
) 

select * 
from cte_example 
group by StaffName 

派生テーブル:

select * 
from 
(
SELECT sf.StfFirstName + ' ' + sf.StfLastname As StaffName, COUNT(fc.StaffID) 
FROM Staff sf 
JOIN Faculty_Classes fc 
ON sf.StaffID = fc.StaffID 
join Classes cl 
ON fc.ClassID = cl.ClassID 
) t1 --note the table alias 
group by StaffName 
+1

どちらの例も真ですが、どちらのサブクエリでもdistinctは必須ではありません。 –

+0

それを指摘していただきありがとうございます、私はクエリに従っていませんでした。 – Simon