2011-08-09 6 views
3

私はこのようになりますテーブルの構造を有する:これはサブセットなしでも達成できますか?

列: 口座番号 サービスコード 数量

アカウントが別の行に複数のサービスコードを持つことができます。たとえば、このアカウント「1868603」のため、彼らのサービスコードは次のように保存されています。

ACCOUNT_NUMBER SERVICE_CODE SERVICE_QUANTITY 
1868603  101  1 
1868603  101  1 
1868603  101  1 
1868603  101  1 
1868603  101  1 
1868603  101  1 
1868603  326  1 
1868603  326  1 
1868603  327  1 
1868603  327  1 
1868603  328  1 
1868603  328  1 

は、私は特定のサービスコードが自分のアカウントにあるかどうかを確認する必要があるクエリを書いています。私はその量を心配していません。私はちょうどそれらがアカウントのために存在するかどうかを見たいと思う。

これは私がこれまで持っているものです。

私を与える
SELECT ACCOUNT_NUMBER, COUNT(SERVICE_CODE) HOW_MANY 
FROM (
    SELECT DISTINCT ACCOUNT_NUMBER, SERVICE_CODE 
    FROM CUSTOMER_SERVICES 
    WHERE ACCOUNT_NUMBER = 1868603 
     AND  SERVICE_CODE IN('323','326','327','328') 
) 
GROUP BY ACCOUNT_NUMBER 

:INの3つのインスタンス( '323'、 '326があるので

ACCOUNT_NUMBER HOW_MANY 
1868603 3 

3は、正しい番号です'、' 327 '、' 328 ')、これは私が決定しようとしているものです。

最初にデータをサブセット化せずにこのクエリを簡略化する方法はありますか?

ありがとうございます!

答えて

1

ORACLEはCOUNT(DISTINCT <field>)を行うことができますか?

SELECT 
    ACCOUNT_NUMBER, COUNT(DISTINCT SERVICE_CODE) HOW_MANY 
FROM 
    CUSTOMER_SERVICES 
WHERE 
    ACCOUNT_NUMBER = 1868603 
    AND SERVICE_CODE IN('323','326','327','328') 
GROUP BY 
    ACCOUNT_NUMBER 


また、サブquerysを持つことが常には、パフォーマンスの低下を意味するものではありませないことに注意してください。 SQLはロジックを表現するための言語ですが、SQLに非常によく似た感じではない方法でコンパイルおよび実行されます。そのようなウィンドウ関数(DENSE_RANKのような)も試してみる価値があるの異なるパフォーマンスcharacterticsを有することができるよう

...

SELECT 
    account_number, 
    MAX(rank_id) 
FROM 
(
    SELECT 
    account_number, 
    DENSE_RANK() OVER (PARTITION BY account_number ORDER BY service_code) AS rank_id 
    FROM 
    customer_services 
    WHERE 
    account_number = 1868603 
    AND service_code IN('323','326','327','328') 
) 
    AS Data 
GROUP BY 
    account_number 
+0

はい、Oracleができhttp://download.oracle.com/docs/cd/B19306_01 /server.102/b14200/functions032.htm。あなたは尋ねるのか答えますか? –

1

はい:

SELECT ACCOUNT_NUMBER, COUNT(DISTINCT SERVICE_CODE) HOW_MANY 
FROM CUSTOMER_SERVICES 
WHERE ACCOUNT_NUMBER = 1868603 
AND  SERVICE_CODE IN('323','326','327','328') 
GROUP BY ACCOUNT_NUMBER 
関連する問題