用计算查询最有效的方法

时间:2016-04-14 12:14:52

标签: sql sql-server sql-server-2012

我已经在下面写了一个工作正常的问题&产生正确的结果。但是我觉得这可能不是非常有效,因为我的SQL经验非常有限。

突出的主要是我计算名义差异的地方。价格差异,这两行。

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 :(得分:1)

首先你选择没有where条件,你有结果作为表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 :(得分:1)

您可以在第二个CTE中包含计算部分,然后您可以在最终选择查询中简单地选择或过滤计算字段作为普通列,而无需进一步计算。