根据条件划分或乘以(改进查询)

时间:2017-10-19 15:24:58

标签: sql sql-server performance tsql

我正在制作一个程序,我想改进这部分。

IF(Currency) BEGIN
    SELECT ISNULL(SUM(Amount / ExchangeRate), 0.00)
    FROM SomeTables
    WHERE SomeConditions
END
ELSE BEGIN
    SELECT ISNULL(SUM(Amount * ExchangeRate), 0.00)
    FROM SomeTables
    WHERE SomeConditions
END

问题是,如果货币是美元,那么我必须分开,否则我必须乘以。查询涉及六个表和许多条件,因此它是25行,我不想在IF条件内重复代码。我想在开头定义运算符并在查询中使用它(我的意思是一个SELECT)。这只是改善目的......

关于如何解决它的一些想法?提前谢谢。

3 个答案:

答案 0 :(得分:2)

您可以使用CASE WHEN THEN,也许是这样:

SELECT ISNULL (CASE WHEN Currency 
                    THEN SUM(Amount / ExchangeRate)
                    ELSE SUM(Amount * ExchangeRate)
                     END,
        0.00 )  LocalCurrency 
  FROM SomeTables
  etc.

这将允许您只使用一个SELECT语句,这是一个有用的简化。

答案 1 :(得分:0)

你可以试试这个:

SELECT ISNULL (CASE WHEN Currency = 'USD'
                    THEN SUM(Amount / ExchangeRate)
                    ELSE SUM(Amount * ExchangeRate)
                    END, 0.00 )  TotalAmount 
FROM SomeTables
WHERE SomeConditions

答案 2 :(得分:-1)

利用动态查询。根据@Operator中的货币存储要使用的运算符

SET @Query = 'SELECT ISNULL(SUM(Amount ' +  @Operator  + ' ExchangeRate), 0.00)
FROM SomeTables
WHERE SomeConditions'

EXEC SP_EXECUTESQL  @Query