【问题标题】:Create a value adding two columns together创建一个将两列加在一起的值
【发布时间】:2018-03-05 18:19:20
【问题描述】:

我正在尝试定义一个名为End Year 的新列,这是对另一列的计算加上一个代表年数的数字。由于某种原因,我的脚本无法使用 SQL Server 2008 中 SQL 语句下面的摘录识别名为 Allocation Year 的新列。请注意,Contract Year 是在未编辑的完整脚本中标识的现有列:

,[Allocation Type] =
CASE 
WHEN left([contract type] ,1)'1' = THEN 'O&M'
ELSE 'N/A'
END
,[Allocation Year] =
CASE
WHEN [Contract Year]='XXXX' THEN '0'
ELSE CAST ([Contract Year] AS INT)
END
,[End Year] =
CASE
WHEN [Allocation Type]='O&M' THEN [Allocation Year] + 6
END

【问题讨论】:

  • 确认一下,您要在查询结果中添加一列 - 而不是实际表?
  • 我认为您在上一个案例中缺少 ELSE。
  • 是的,我认为最好在视图上创建而不是在表中创建一个永久列。

标签: sql sql-server calculated-columns


【解决方案1】:

使用AS 关键字(在许多情况下也可以省略)来命名列,而不是使用= 运算符。

SQL Server 不允许您在 SELECT 子句中引用其他列或别名 - 您必须使用子查询:

像这样:

SELECT
    *,
    CASE WHEN [Allocation Type] = 'O&M'
        THEN [Allocation Year Temp] + 6
        ELSE NULL
    END AS [Allocation Year]
FROM
(
    SELECT
        CASE WHEN LEFT( [Contract type], 1 ) = '1'
            THEN 'O&M'
            ELSE 'N/A'
        END AS [Allocation Type],

        CASE WHEN [Contract Year] = 'XXXX' 
            THEN '0'
            ELSE CAST( [Contract Year] AS int )
        END AS [Allocation Year Temp],
        *
    FROM
        ....
)

【讨论】:

  • 列是用 AS 关键字命名的,而不是用 = 操作符。,实际上你可以在 SQL Server 中做到这两个。
  • SQL Server 不允许您在 SELECT 子句中引用其他列或别名,也许所有数据库都不允许您这样做。你知道有什么数据库吗?
  • @RacilHilan 我知道至少 MySQL 和 PostgreSQL 确实允许您在不需要子查询的情况下引用别名。
  • 你知道他们知道,还是你认为他们知道?你有参考,或者你能提供一个 SQL Fiddle 吗? AFAIK 他们都没有,Oracle 也没有。你提到了 SQL Server,所以没有一个主要的数据库允许这样做。
  • @RacilHilan 我很抱歉 - 我在想他们如何让你在 WHERE 中使用别名。
【解决方案2】:

如果您想将所有内容放在一个选择查询中,请尝试这个。希望这可以帮助。谢谢。

,[End Year] =
CASE
WHEN left([contract type] ,1)='1' THEN 
  (CASE
    WHEN [Contract Year]='XXXX' THEN 6
   ELSE (CAST ([Contract Year] AS INT) + 6 )
  END)
END

【讨论】:

    【解决方案3】:

    您不能在SELECT 语句中引用计算列。您必须重复计算(或使用 Dai 建议的子查询):

    ,[Allocation Type] =
    CASE 
    WHEN left([contract type] ,1)='1' THEN 'O&M'
    ELSE 'N/A'
    END
    ,[Allocation Year] =
    CASE
    WHEN [Contract Year]='XXXX' THEN 0
    ELSE CAST ([Contract Year] AS INT)
    END
    ,[End Year] =
    CASE
    WHEN left([contract type] ,1)='1' THEN (CASE
                                            WHEN [Contract Year]='XXXX' THEN 0
                                            ELSE CAST ([Contract Year] AS INT)
                                            END) + 6
    END
    

    【讨论】:

    • 谢谢大家。这有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多