2011-02-22 5 views
1
Visit 
tmstamp, trackno, qno, service 
01/01/2011,1,  01, Sv1 
01/01/2011,2,  03, Sv1 
01/01/2011,3,  04, Sv2 
01/01/2011,4,  06, Sv2 
01/02/2011,1,  01, Sv1 

Matter 
tmstamp, trackno, code 
01/01/2011,1,  a 
01/01/2011,1,  b 
01/01/2011,1,  e 
01/01/2011,2,  c 
01/01/2011,2,  b 
01/01/2011,3,  c 
01/01/2011,3,  a 
01/01/2011,4,  d 
01/01/2011,4,  c 
01/02/2011,1,  a 
01/02/2011,1,  b 

select service, count(qno) as 'qno_served' from visit group by service 

service, qno_served 
SV1,  3 
SV2,  2 

私の現在の声明は、それぞれserviceのためにどれくらい多くのqnoを持っていますか?メインテーブルがSQLのtbl1である間にtbl2からの行を無視するには?

matterテーブルにリンクするように私の声明をひねりたいです。 qnocode "a"が含まれているかどうかを確認します。

qnocode "A" を持っている場合は、私がでカウントする必要はありません。

だから、私の最終的な結果は、このリンケbのだろう。

service, qno_served 
SV1,  1 
SV2,  1 

これを取得するには、私はjoinメソッドまたはwhtメソッドを使用しますか?

答えて

4

試してみてください。

SELECT Service, COUNT(qno) AS [qno_served] 
    FROM Visit 
WHERE NOT EXISTS (
    SELECT * FROM Matter WHERE Matter.TrackNo = Visit.TrackNo AND Matter.code = 'a') 
GROUP BY Service 
+0

それは効率的ではないでしょう。訪問テーブルの行ごとにWHERE句でクエリを実行しますようにこれが見えます。 – tponthieux

+0

@tponthieux http://sqlinthewild.co.za/index.php/2010/03/23/left-outer-join-vs-not-exists/ –

+1

リンク@Martinが指摘したように、それは必ずしも必要ではない本当。これは、アンチ・セミ・ジョインのための非常に一般的な構成であり、SQL Serverはそれを処理するのに熟練しています。ハッシュ・マージ・ジョイン・イテレーター(ネストされたループだけでなく)を使用することもできます。どちらも、内部表を2回以上反復する必要はありません。セミ・ジョイン(where句のEXISTS)やselect句の相関サブクエリなど、他の相関サブクエリも同様です。 –

1
SELECT 
V.service 
,COUNT(1) AS qno_served 

FROM MyDatabase.dbo.Visit AS V 

LEFT JOIN (
    SELECT DISTINCT 
    M.trackno 

    FROM MyDatabase.dbo.Matter AS M 

    WHERE M.code = 'a' 
) AS T 
    ON V.trackno = T.trackno 

WHERE T.Trackno IS NULL 

GROUP BY V.service 

ORDER BY service 
関連する問題