0

例如,我有两列 A 和 B。

A 列包含数字 1 - 10。B 列包含月份 Jan - Oct

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

我猜我可以使用某种 CASE 逻辑来做到这一点?

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

我知道上述逻辑是错误的,我试图了解如何做到这一点。有任何想法吗?

谢谢

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

值得补充的是,我在 A 列中的每个数据点都有多个案例。我的查询中还有其他列是唯一的,所以我不能使用 DISTINCT。

'子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的”

4

4 回答 4

0

听起来你想要一个通用的解决方案。不幸的是,按照您的方式存储月份名称并不是很有效。但是你可以通过自加入来做到这一点:

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
于 2013-06-28T02:27:47.797 回答
0

你很接近,可以这样做(但这将返回 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'

在此处查看第二次运行的示例

于 2013-06-28T02:04:35.910 回答
0

如果您想查看结果,您必须选择第 1 表,试试这个

select CASE when ColB = 'March' THEN (Select ColA From yourtable where ColB = 'January') END     
from yourtable 
于 2013-06-28T02:05:36.540 回答
0

我认为自我加入会为您提供最好的服务:

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'
于 2013-06-28T02:10:43.423 回答