2017-11-30 9 views
0

私は、2つの異なる通貨(ドルとボリビアーノ)で1社の業務量を取得する必要があります。私はストアドプロシージャで2つのクエリを作成し、それは動作します。私の問題は、ほとんど同じであるため、一意のクエリでそれらをマージする方法がわかりません。クエリを改善しようとしています

SELECT @amount_dollars = ISNULL(SUM(Amount), 0.00) 
FROM ProcessBatches 
WHERE 
    CompanyId = @company_id 
    AND CONVERT(CHAR(8), DateProcess, 112) = @current_date 
    AND Currency = 'USD' 
    AND OperationTypeId NOT IN (17,18) 
    AND State IN ('P','W','N','A') 

SELECT @amount_bols = ISNULL(SUM(Amount), 0.00) 
FROM ProcessBatches 
WHERE 
    CompanyId = @company_id 
    AND CONVERT(CHAR(8), DateProcess, 112) = @current_date 
    AND Currency = 'BOL' 
    AND OperationTypeId NOT IN (17,18) 
    AND State IN ('P','W','N','A') 

私はSQLの専門家ではありません。事前のおかげで、私の英語のため申し訳ありません(私が学んでいます)

答えて

6

ちょうど条件付き集約使用:

SELECT @amount_dollars = COALESCE(SUM(CASE WHEN Currency = 'USD' THEN Amount END), 0.00) , 
     @amount_bols = COALESCE(SUM(CASE WHEN Currency = 'BOL' THEN Amount END), 0.00)   
FROM ProcessBatches 
WHERE CompanyId = @company_id AND 
     CAST(DateProcess as date) = @current_date AND 
     Currency IN ('BOL', 'USD') AND 
     OperationTypeId NOT IN (17, 18) AND 
     State IN ('P', 'W', 'N', 'A'); 

注:私はdateデータ型を使用するdate比較を変更しました。これは、文字列比較を使用するよりはるかに優れています。さらに、現在までの変換では、SQL Serverでインデックスを使用することができます。

+0

うん!、それは動作します。ありがとう。私はCOALESCE関数を知らない。 –

+2

@HéctorÁlvarez:「日付型にインデックスを入れないようにしてください。どうして? –

+1

@HéctorÁlvarezもし私があなたのコメントをdownvoteできます。インデックス作成の日付列は非常に一般的で効果的な戦略です。データ型にかかわらず、インデックスにはコストがかかります。コストと便益のバランスをとることができます。また、索引内の列のセットは一意ではないことが一般的です。トランザクションテーブルのcustomeridにインデックスを登録します。それは確かにユニークではありません - どのようにエラーを引き起こすのでしょうか? – SMor

関連する問題