2016-04-14 17 views
3

私は正確に動作する以下のクエリを書いています&正しい結果を生成します。しかし、私のSQLの経験は非常に限られているので、おそらくこれはひどく効率的ではないと感じています。計算のクエリが最も効率的な方法

主なものは、私が名義差異を計算するところです。&価格差、これらの2つの行。

1. isnull(hld.Nominal, 0) - isnull(nav.Nominal, 0) NomDiff 
2. isnull((hld.Price/nav.LocalPrice - 1) * 100, 0) 

私も同じ計算を二回に計算されているので、WHERE条件にこ​​れらの行の両方を置く必要があるため。このクエリを書くためのより良い方法は何ですか?

;WITH hld AS 
(
    SELECT id, 
      name, 
      Nominal, 
      Price 
    FROM tblIH 
), 
nav AS 
(
    SELECT id, 
      name, 
      Nominal, 
      LocalPrice 
    FROM tblNC 
) 
SELECT COALESCE(hld.id, nav.id) id, 
     COALESCE(nav.name, hld.name) name, 
     ISNULL(hld.Nominal, 0) HldNom, 
     ISNULL(nav.Nominal, 0) NavNom, 
     ISNULL(hld.Nominal, 0) - ISNULL(nav.Nominal, 0) NomDiff, 
     ISNULL(hld.Price, 0) HldPrice, 
     ISNULL(nav.LocalPrice, 0) NavPrice, 
     ISNULL((hld.Price/nav.LocalPrice - 1) * 100, 0) 
FROM hld 
FULL OUTER JOIN nav ON hld.id = nav.id 
WHERE ISNULL(hld.Nominal, 0) - ISNULL(nav.Nominal, 0) <> 0 
    OR ISNULL((hld.Price/nav.LocalPrice - 1) * 100, 0) <> 0 
+2

サンプルデータ、望ましい結果、およびあなたがしようとしていることの説明を含めることをお勧めします。 –

+0

あなたはISNULLの代わりにCOALESCEを使用しますが、おそらく同じ性能を持ちます。 COALESCEは若干優れている場合があります。INSULLを何度も呼び出すと、パフォーマンスが向上します。 – Antonio

+1

計算部分は2番目のCTEに含めることができます。計算されたフィールドを最後の選択クエリを実行する必要はありません。 –

答えて

1

あなたは、その後、条件、あなたがテーブルTMPとして結果を持って、あなたは、カラムNomDiffとPriceDiff

;WITH hld AS 
(
    SELECT id, 
      name, 
      Nominal, 
      Price 
    FROM tblIH 
), 
nav AS 
(
    SELECT id, 
      name, 
      Nominal, 
      LocalPrice 
    FROM tblNC 
) 
select * 
from (SELECT COALESCE(hld.id, nav.id) id, 
      COALESCE(nav.name, hld.name) name, 
      ISNULL(hld.Nominal, 0) HldNom, 
      ISNULL(nav.Nominal, 0) NavNom, 
      ISNULL(hld.Nominal, 0) - ISNULL(nav.Nominal, 0) NomDiff, 
      ISNULL(hld.Price, 0) HldPrice, 
      ISNULL(nav.LocalPrice, 0) NavPrice, 
      ISNULL((hld.Price/nav.LocalPrice - 1) * 100, 0) PriceDiff 
    FROM hld 
    FULL OUTER JOIN nav ON hld.id = nav.id) tmp 
where NomDiff <> 0 or PriceDiff <> 0 
1

あなたは第二CTEに含めることができる演算部とWHERE条件を追加する場所ずに選択するには、最初のさらに計算をせずに、最終的な選択クエリで計算されたフィールドを通常の列として単に選択またはフィルタリングすることができます。

関連する問題