【问题标题】:MS SQL Server: Operate current select values in other selected columnsMS SQL Server:在其他选定列中操作当前选择值
【发布时间】:2017-09-18 15:30:48
【问题描述】:

我想从选定的列中获取一个值来操作下一列。例如:

SELECT CASE 
  WHEN ID < 4 THEN ID
  ELSE 10
END
AS MY_ID,
MY_ID + 5 AS EXTRA_ID
FROM FOO

这将为 ID 1,2,3,4,5 输出:

MY_ID EXTRA_ID
1      6
2      7
3      8
10     15
10     15

如果我这样做 MY_ID + 5 它会抱怨 MY_ID 不存在(这是一个别名,所以它是有道理的)并且 ID + 5 在通过 ELSE 时将读取 1+5, 2+5, 3+5, 4+5, 5+5 而不是 1+5, 2+5, 3+5, 4+10, 5+10。甚至有可能做到这一点吗?我在 SSRS - 报告生成器中执行此操作,并且需要根据 CASE 子句操作可能设置为默认值的结果。

【问题讨论】:

    标签: sql sql-server reporting-services


    【解决方案1】:

    您可以在 extra_id 列的末尾加上 +5 重复相同的 CASE 表达式

    SELECT CASE 
      WHEN ID < 4 THEN ID
      ELSE 10
    END
    AS MY_ID,
    CASE 
      WHEN ID < 4 THEN ID
      ELSE 10
    END + 5 AS EXTRA_ID
    FROM FOO
    

    另一种方法是使用表达式在 SSRS 中创建 extra_id 列值

    = Fields!my_id.value + 5

    【讨论】:

    • 我只是想澄清其他答案也是正确的,但这个是最简单的,并提供了解决方案的示例。真的很简单,谢谢!
    【解决方案2】:

    您不能在同一级别重复使用计算。在 where 子句中使用 my_id 也会失败。您必须多次计算它,在语句周围放置另一个选择或使用 with 语句 (CTE)。

    【讨论】:

      【解决方案3】:

      用另一个选择简单地包装它:

      SELECT t.*,
             t.my_id + 5 as extra_id
      FROM(Your Query) t
      

      派生列在创建它们的同一层中不可用。通过用另一个选择包装它们,您可以使它们可用(因为内部查询在外部查询之前被处理)。

      【讨论】:

        【解决方案4】:

        您只需要一个子查询来创建MY_ID,然后再对其进行任何操作。通过在内部查询中创建MY_ID,外部查询可以用来定义新字段。

        SELECT 
            a.MY_ID, 
            a.MY_ID + 5 AS EXTRA_ID
        from
            (SELECT 
                CASE 
                  WHEN ID < 4 THEN ID
                  ELSE 10
                END
                AS MY_ID
            FROM FOO) as a
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-12
          • 2021-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-19
          • 2014-09-15
          相关资源
          最近更新 更多