Создание условного столбца в SQL - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь создать условный столбец в T-SQL, как оператор if, но вместо того, чтобы печатать строку, я бы хотел, чтобы он просматривал данные из другого столбца в наборе данных.

SELECT 
    CASE 
       WHEN NameDay = 'Sunday' 
          THEN [sales] 
          ELSE [SunAdj] 
    END AS AdjustedDays
FROM 
    Table

Как правило, я хочу получить данные из столбца [sales], если день в столбце NameDay - «Воскресенье», в противном случае получить значение из [SunAdj]. Я могу заставить его работать, заполняя строку, но не данные из других столбцов. Это возможно? Если так, то как? Любая помощь приветствуется.

Product   category    Sales   SunAdj    NameDay  
--------------------------------------------------
Meat                  1000     3500     Sunday  
Fish                  1000     3500     Wednesday  
Bakery                1000     3500     Friday  

Я бы хотел другой столбец с именем AdjustedDays, показывающий 1000 для первой строки и 3500 для остальных.

1 Ответ

0 голосов
/ 10 сентября 2018

Это быстрая настройка CTE данных в вопросе:

; with sourceData (Product, Category, Sales, SunAdj, NameDay)
as 
(
      select 'Meat', null, 1000, 3500, 'Sunday'
union select 'Fish', null, 1000, 3500, 'Wednesday'
union select 'Bakery', null, 1000, 3500, 'Friday'
)
...

и мы можем использовать его, чтобы показать, что ваше утверждение уже верно:

; with sourceData (Product, Category, Sales, SunAdj, NameDay)
as 
(
      select 'Meat', null, 1000, 3500, 'Sunday'
union select 'Fish', null, 1000, 3500, 'Wednesday'
union select 'Bakery', null, 1000, 3500, 'Friday'
)
select 
    Product, Category, Sales, SunAdj, NameDay, 
    CASE when NameDay = 'Sunday' then [sales] 
         else [SunAdj] end as AdjustedDays
from sourceData

Просто добавив небольшую ценность в мой ответ, вы можете добиться того же с помощью функции IIF:

; with sourceData (Product, Category, Sales, SunAdj, NameDay)
as 
(
      select 'Meat', null, 1000, 3500, 'Sunday'
union select 'Fish', null, 1000, 3500, 'Wednesday'
union select 'Bakery', null, 1000, 3500, 'Friday'
)
select 
    Product, Category, Sales, SunAdj, NameDay, iif(NameDay='Sunday', SunAdj, Sales) AdjustedDays
from sourceData

Оба запроса дают одинаковый результат:

Product Category    Sales       SunAdj      NameDay   AdjustedDays
------- ----------- ----------- ----------- --------- ------------
Bakery  NULL        1000        3500        Friday    1000
Fish    NULL        1000        3500        Wednesday 1000
Meat    NULL        1000        3500        Sunday    3500
...