【问题标题】:How to set a calculated column using a subquery如何使用子查询设置计算列
【发布时间】:2018-07-03 12:43:50
【问题描述】:

我有一个表格,我想在其中添加一个计算列。我要设置的查询比标准算术运算更复杂,我不确定如何使用查询设置计算列。我尝试使用 ALTER TABLE 语句:

    ALTER TABLE shareholder.Amount
ADD CalculatedAmount As 
(SELECT sum(Amount) FROM shareholder.TransactionInput T 
                    WHERE T.ShareClassLabel = Amount.ShareClassLabel
                    AND T.ValuationDate < Amount.NAVDate
                    GROUP BY T.ShareClassLabel)

但这会导致错误:'在此上下文中不允许子查询。只允许标量表达式'。 我知道子查询本身可以正常工作,并自行对其进行测试,因此只需弄清楚如何将计算列设置为它的结果。

谢谢! (我使用的是 SQL Server 2014 Management Studio)

【问题讨论】:

  • 好吧.....正如错误消息所说,计算列中不允许子查询

标签: sql-server select calculated-columns table-structure


【解决方案1】:

不可能有一个带有子查询的计算列,

计算列是根据可以使用其他表达式的表达式计算得出的 同一个表中的列。

所以不可能有 A Query 但你可以使用 Expressions Like

ColumnA-ColumnB+ColumnC

相反,您可以将其转换为视图并在那里计算列值

这样

CREATE VIEW MyComputedvIEW
AS
SELECT
  *,
  CalculatedAmount = (SELECT sum(Amount) FROM shareholder.TransactionInput T 
                    WHERE T.ShareClassLabel = Amount.ShareClassLabel
                    AND T.ValuationDate < Amount.NAVDate
                    GROUP BY T.ShareClassLabel)
FROM YourTable

【讨论】:

  • 啊,好吧,我不明白计算列只能引用同一个表。谢谢。
  • 计算列可以基于其他表,但在这种情况下,您必须使用标量函数@D.Yvel
【解决方案2】:

可以通过小技巧(UDF)添加子查询,请参见我的示例([ChildCount] 字段):

CREATE TABLE [wp].[StorageData](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](200) NOT NULL,
    [StorageHid] [hierarchyid] NOT NULL,
    [StoragePath]  AS ([StorageHid].[ToString]()),
    [StorageLevel]  AS ([StorageHid].[GetLevel]()),
    [StorageParentHid]  AS ([StorageHid].[GetAncestor]((1))),
    [StorageParent]  AS ([StorageHid].[GetAncestor]((1)).ToString()),
    [ChildCount]  AS ([wp].[GetStorageDataChildItemCount]([StorageHid].[ToString]()))
)

CREATE FUNCTION [wp].[GetStorageDataChildItemCount]
(
    @storagePath NVARCHAR(4000)
)
RETURNS INT
AS
BEGIN

    DECLARE @ret INT = 0;
    SET @ret = (SELECT COUNT(ID) FROM [wp].[StorageData] R WHERE R.StorageParent = @storagePath)
    RETURN @ret;

END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    相关资源
    最近更新 更多