SQL Server 使用CASE IF逻辑在指定某个变量时返回列

dced5bon  于 2023-02-11  发布在  其他
关注(0)|答案(4)|浏览(96)

例如,我有两列A和B。
A列包含数字1 - 10。B列包含月份1月-10月
我需要帮助编写逻辑,查看列B并返回列A中2个月前的值。例如,列B是三月,我想返回一月的值。
我猜我可以使用某种CASE逻辑来做到这一点?

CASE WHEN ColB = 'March' THEN (Select ColA where ColB = 'January')

我知道上面的逻辑是错误的,我正在努力理解如何做到这一点。有什么想法吗?
谢谢
更新:这个例子是一个非常大的过度简化...我遇到了一个错误时,使用任何逻辑每个人都建议...
值得补充的是,我在列A中的每个数据点都有多个事例。我的查询中还有其他列是唯一的,因此我不能使用DISTINCT。
'子查询返回了多个值。当子查询跟在=、!=、〈、〈=、〉、〉=之后或子查询用作表达式时,不允许出现这种情况”

yvt65v4c

yvt65v4c1#

如果要查看结果,必须先选择表,请尝试以下操作

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

ui7jx7zq2#

我认为你最好是自己加入:

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

演示:SQL小提琴
这适用于所有月份,但您可以将其限制在您的示例中:

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

nom7f22z3#

您已经接近了,可以这样做(但这将返回9个空行和一个有效行)

SELECT
      CASE WHEN ColB = 'March' 
        THEN (Select ColA FROM tablename WHERE ColB = 'January') 
      END
FROM tablename

或者可以不用CASE就完成

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

参见此处的第二次运行示例

olhwl3o2

olhwl3o24#

听起来你需要一个通用的解决方案。不幸的是,像这样存储月份名称并不是很有效。但是你可以通过一个self-join来实现:

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

相关问题