【问题标题】:How to Select and multiply certain columns based off criteria?如何根据条件选择和相乘某些列?
【发布时间】:2020-07-20 23:01:47
【问题描述】:

我正在尝试为欧洲国家编写一个动态的代码,以根据某个国家/地区捕获适当的价格。我正在尝试提取标价小于 4000 的数据,但想添加一条语句,如果货币以瑞典克朗为单位,那么我想将该标价乘以 10,然后如果它小于 4000,我想包括它。对于其他货币,只需按照货币代码 EUR、GBP 和 CHF 的标价计算。

例如,这是我所拥有的,但它无法正常工作:

SELECT
       [Country_IBS]
      ,[Item_Number]
      ,[Price_List]
      ,List_Price
      ,[Currency]
FROM #temp4

WHERE List_Price < 4000 

OR (SELECT List_Price * 10 WHERE Currency = 'SEK') < 4000
AND Currency = 'EUR'
OR Currency = 'GBP'
OR Currency = 'CHF'

【问题讨论】:

  • AND 在 OR 之前求值。你需要括号。例如。 AND (Currency = 'EUR' OR Currency = 'GBP' OR Currency = 'CHF')。 (那个也可以写成AND Currency IN ('EUR', 'GBP', 'CHF')。)
  • 如果您可以比“它无法正常工作”更具体,它会有所帮助。请阅读this,了解一些改进问题的技巧。

标签: sql sql-server tsql select where-clause


【解决方案1】:

我愿意:

where
    list_price * (case when currency = 'SEK' then 10 else 1 end) < 4000
    and currency in ('EUR', 'GBP', 'CHF', 'SEK')

或者你可以使用更详细的形式:

where
    (currency in ('EUR', 'GBP', 'CHF') and list_price < 4000)
    or (currency = 'SEK' and price < 400)

【讨论】:

    【解决方案2】:

    AND 的优先级高于OR。你需要在括号中加上你的条件。

    您的查询应该是这样的:

    --version 1: Using OR
    SELECT
           [Country_IBS]
          ,[Item_Number]
          ,[Price_List]
          ,List_Price
          ,[Currency]
    FROM #temp4
    WHERE (List_Price < 4000 AND Currency IN ('EUR','GBP','CHF'))
    OR (List_Price * 10 < 4000 AND Currency = 'SEK')
    
    --Version 2: Using UNION ALL
    SELECT
           [Country_IBS]
          ,[Item_Number]
          ,[Price_List]
          ,List_Price
          ,[Currency]
    FROM #temp4
    WHERE List_Price < 4000 AND Currency IN ('EUR','GBP','CHF')
    
    UNION ALL
    
    SELECT
           [Country_IBS]
          ,[Item_Number]
          ,[Price_List]
          ,List_Price
          ,[Currency]
    FROM #temp4
    WHERE List_Price * 10 < 4000 AND Currency = 'SEK'
    

    这些返回相同结果集的查询可能具有不同的查询计划,具体取决于您在表上创建的索引。使用比另一个更有效的。

    探索Operator PrecedenceUNION 了解更多详情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 2020-10-01
      • 2022-11-27
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多