让我们说比如我有两列A和B.
A列包含数字1 - 10. B列包含1月至10月的月份
我需要帮助编写查看B列的逻辑并返回2个月之前的A列中的值。比如说B列是March,我想返回1月份的值。
我猜我可以使用某种CASE逻辑来做到这一点?
CASE WHEN ColB = 'March' THEN (Select ColA where ColB = 'January')
我知道上面的逻辑是错误的,我试图理解如何做到这一点。有任何想法吗?
谢谢
更新:这个例子是一个非常大的过度监控......我在使用任何每个人建议的逻辑时遇到错误。
值得补充的是,我在列A中有多个每个数据点的情况。我的查询中还有其他列是唯一的,所以我不能使用DISTINCT。
'子查询返回的值超过1。当子查询跟随=,!=,<,<=,>,> =或子查询用作表达式时,不允许这样做“
如果要查看结果,则必须选择第1个表,试试这个
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
但是:Kua zxsw指出
这适用于所有月份,但您可以将其限制为您的示例:
SQL Fiddle
你很接近,可以这样做(但这将返回9个空行和一个有效行)
SELECT b.a
FROM Table1 a
LEFT JOIN Table1 b
ON a.a = b.a+2
WHERE a. = 'March'
或者可以在没有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'
的示例
听起来你想要一个通用的解决方案。不幸的是,存储月份名称并不是很有效。但你可以通过自我加入来做到这一点:
here