Как выбрать и умножить определенные столбцы на основе критериев? - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь написать код, который является динамическим c для европейских стран, чтобы получить соответствующую цену, основанную на определенной стране. Я пытаюсь получить данные, где цена по прайс-листу меньше 4000, но мне хотелось добавить утверждение, что если валюта в SEK, то я хочу умножить эту прайс-лист на 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'

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

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'

Эти запросы, возвращающие один и тот же набор результатов, могут иметь другой план запросов в соответствии с индексами, созданными в вашей таблице. Используйте тот, который эффективнее другого.

Для получения более подробной информации Приоритет оператора и UNION .

0 голосов
/ 08 апреля 2020

Я бы сделал:

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)
...