私は正確に動作する以下のクエリを書いています&正しい結果を生成します。しかし、私の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
サンプルデータ、望ましい結果、およびあなたがしようとしていることの説明を含めることをお勧めします。 –
あなたはISNULLの代わりにCOALESCEを使用しますが、おそらく同じ性能を持ちます。 COALESCEは若干優れている場合があります。INSULLを何度も呼び出すと、パフォーマンスが向上します。 – Antonio
計算部分は2番目のCTEに含めることができます。計算されたフィールドを最後の選択クエリを実行する必要はありません。 –