2011-09-15 5 views
0

COUNT(*)GROUP BYを使用して作成された列を、カウントされた元の選択に追加しようとしています。しかし、選択は非常に複雑です(私の例ではWHERE ...行以上でした)ので、コードは重複しません。結合内のエイリアスの繰り返し使用

SQL Serverは、左側のjoinステートメント内に別名t1を使用することを承認しません。助言がありますか?それが2005年以降になら


select t1.school, t1.grade,t1.individual,t2.cnt as 'class size' from (
     select * from students 
     where (students.age < 16 and students.ACT_score is not null) 
) as t1 
left join (
    select distinct school, grade, count(*) as 'cnt' from t1 
    group by school, grade 
) as t2 
on t1.school = t2.school and t1.grade = t2.grade 

+0

SQLサーバーのバージョンは? – JNK

+0

2005年、私は –

+0

の列 'subjects.ACT_score'を参照しますが、テーブル' subjects'は参照していません... – RedFilter

答えて

3

、CTEを使用します。

;WITH MyCTE AS 
(
<Your complicate query here> 
) 
SELECT fields 
FROM MyCTE 
JOIN (subquery referencing MyCTE) 
... 
+0

これはうまくいくようです。私は前に 'with 'を使ったことがない、何かを落とす必要があるのか​​、それともエイリアスとして振る舞うのだろうか? –

+0

@Mr。 Dave - CTEは基本的に1つのクエリにのみ有効なビューです。落とすなどの必要はありません。 – JNK

+0

偉大な、助けてくれてありがとう! –

1

は、私は簡単な形式でクエリを書き直し、何のCTEは必要ありません:

SELECT t1.school 
    ,t1.grade 
    ,t1.individual 
    ,t2.cnt AS 'class size' 
FROM students t1 
LEFT JOIN (
    SELECT school 
     ,grade 
     ,count(*) AS 'cnt' 
    FROM students 
    GROUP BY school, grade 
) AS t2 ON t1.school = t2.school 
     AND t1.grade = t2.grade 
WHERE t1.age < 16 
    AND t1.ACT_score IS NOT NULL 
+0

これはうまくいかないようですが、私は「FROM t1」が原因だと信じています。エラーメッセージには、「無効なオブジェクト名 't1'」と表示されます。 –

+0

コピー、貼り付けエラーです。 t1は「生徒」とされています。 – RedFilter

3

次のようにCOUNT(*)とOVER句を使用すると、保守が容易になる場合があります。

with cntAppended as (
    select 
    *, 
    count(*) over (partition by school, grade) 
    from students 
) 
    select 
    school, 
    grade, 
    individual, 
    cnt as "class size" 
from cntAppended 
where (age < 16 and ACT_score is not null) 

WITHを避けて、WHERE句をCOUNTを使用して1つのクエリに入れることは避けてください。もしあなたがそうした場合は、各学校の生徒と成績が< 16人で、ACTの得点がある人のみをカウントします。 [クラスのサイズ]列のすべての生徒を数えたいと思うようですが、結果の中の特定のデータのみを表示します。

の場合とT-SQL supports the QUALIFY keyword、このようなクエリはさらに簡単になることがあります。

select 
    school, 
    grade, 
    individual, 
    count(*) over (partition by school, grade) as "class size" 
from students 
QUALIFY (age < 16 and ACT_score is not null) 
関連する問題