Sql 当指定某个变量时,使用CASE IF逻辑返回列

Sql 当指定某个变量时,使用CASE IF逻辑返回列,sql,sql-server,logic,case,case-when,Sql,Sql Server,Logic,Case,Case When,比如说,我有两列A和B A列包含数字1-10。B列包含一月至十月的月份 我需要帮助编写逻辑,查看B列并返回A列中2个月前的值。例如,假设B列是三月,我想返回一月的值 我猜我可以用一些案例逻辑来做这个 CASE WHEN ColB = 'March' THEN (Select ColA where ColB = 'January') 我知道上面的逻辑是错误的,我正在努力理解如何做到这一点。有什么想法吗 谢谢 更新:这个例子过于简单化了。。。我在使用大家建议的任何逻辑时都遇到了错误 值得补充的是

比如说,我有两列A和B

A列包含数字1-10。B列包含一月至十月的月份

我需要帮助编写逻辑,查看B列并返回A列中2个月前的值。例如,假设B列是三月,我想返回一月的值

我猜我可以用一些案例逻辑来做这个

 CASE WHEN ColB = 'March' THEN (Select ColA where ColB = 'January')
我知道上面的逻辑是错误的,我正在努力理解如何做到这一点。有什么想法吗

谢谢

更新:这个例子过于简单化了。。。我在使用大家建议的任何逻辑时都遇到了错误

值得补充的是,A列中的每个数据点都有多个事例。我的查询中还有其他列是唯一的,因此我不能使用不同的


'子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式“

时,可以这样做(但这将返回9个空行和一个有效行)

或者可以在没有
案例的情况下完成

SELECT
  (SELECT colA FROM tablename WHERE colB = 'January')
FROM tablename
WHERE colB = 'March'

参见第二次运行的示例

如果要查看结果,请尝试以下操作

select CASE when ColB = 'March' THEN (Select ColA From yourtable where ColB = 'January') END     
from yourtable 

我认为您最好通过自助加入:

SELECT a.b Month1 ,b.b Month2
FROM Table1 a
LEFT JOIN Table1 b
 ON a.a = b.a+2
演示:

这适用于所有月份,但您可以将其限于您的示例:

SELECT b.a
FROM Table1 a
LEFT JOIN Table1 b
 ON a.a = b.a+2
WHERE a. = 'March'

听起来您需要一个通用的解决方案。不幸的是,按您的方式存储月份名称并不是很有效。但您可以通过自联接来实现:

with t as (
      select t.*,
             (case colB
                   when 'January' then 1
                   when 'February' then 2
                   when 'March' then 3
                   when 'April' then 4
                   when 'May' then 5
                   when 'June' then 6
                   when 'July' then 7
                   when 'August' then 8
                   when 'September' then 9
                   when 'October' then 10
                   when 'November' then 11
                   when 'December' then 12
              end) as monthnum
      from t
     )
select colA,
       (select top 1 colA from t t2 where t2.monthnum = t.monthnum - 2) as ColAMinus2
from t

如果是一月,你会返回什么?我可以使用NULL,或者我可以创建一个局部变量来返回'Not Available'@Goat CO,它返回1,因为JAN的columnA是1。很抱歉,没有足够的代表在这里发布假设这些是他拥有的值,而不仅仅是示例值
with t as (
      select t.*,
             (case colB
                   when 'January' then 1
                   when 'February' then 2
                   when 'March' then 3
                   when 'April' then 4
                   when 'May' then 5
                   when 'June' then 6
                   when 'July' then 7
                   when 'August' then 8
                   when 'September' then 9
                   when 'October' then 10
                   when 'November' then 11
                   when 'December' then 12
              end) as monthnum
      from t
     )
select colA,
       (select top 1 colA from t t2 where t2.monthnum = t.monthnum - 2) as ColAMinus2
from t