2009-07-16 8 views
5

ことで、私は次のクエリがありますカウント合計行

select count(ords.TRACKING_NUM) 
from Orders ords (NoLock) 
group by ords.TRACKING_NUM 
having count(distinct ords.ORDER_NUM) = 4 

を私はそれが(3352でなければなりません)それらの上に4 ORDER_NUMsを持ってTRACKING_NUMsの総量を取得したいです。代わりに、私は3,352行を4に等しい(または別個のために)得る。

なぜこれが起こっているのですか。各グループ内の値を数えています。そして、私は簡単にこれにクエリを変更することができます。

select ords.TRACKING_NUM 
from Orders ords (NoLock) 
group by ords.TRACKING_NUM 
having count(distinct ords.ORDER_NUM) = 4 

し、それは私に戻っTRACKING_NUMsの3352行を取得します。しかし、これは私のデータベースではあまり効果がありません(約41秒かかる)。私が本当に必要とするのは、私にカウントと唯一のカウントを与えるクエリです。

ありがとうございます。

答えて

13
SELECT COUNT(*) 
FROM (
    SELECT TRACKING_NUM 
    FROM Orders 
    GROUP BY TRACKING_NUM 
    HAVING count(distinct ORDER_NUM) = 4) AS Agg 
+0

これをSSMSで実行すると、次のエラーが発生します。メッセージ170、レベル15、状態1、行7 行7: ')'の近くの構文が正しくありません。 – Vaccano

+0

ApexSQL Editで実行すると、次のエラーメッセージが表示されます。メッセージ156、レベル15、状態1、発生した行:10 キーワード 'set'の構文が正しくありません。 – Vaccano

+0

はい、派生テーブルにはエイリアスが必要です –

2
SELECT OrderCount AS 'Total Orders', COUNT(TRACKING_NUM) AS 'Tracking Num Count' 
FROM (
    SELECT DISTINCT TRACKING_NUM, COUNT(DISTINCT ORDER_NUM) AS 'OrderCount' 
    FROM Orders 
    GROUP BY TRACKING_NUM 
) AS tblOrdersPerTrackingNum 

これは、あなたが望んでいたように、あなたのTRACKING_NUMsのためだけのカウントを取得し、また、(ちょうど= 4順序数を持っていない)、総受注の他のすべての量のカウントを取得します。

(あなたのクエリは何らかのレポートのようですが、そのような場合は、パフォーマンスが懸念される場所で頻繁に実行される場合は、あなたが興味を持っている数を変更またはパラメータ化するのではなく、複数回(たとえそれが自動化されていても)再実行するのではなく、1つのクエリの値を使用することができます。 )

私が知っているのは、あなたが尋ねてきたことではない... Remus Rusanuはすでにそれを釘付けにしていましたが、あなたは「何らかの提案」を求めました。

関連する問題