1

我有一个表,我想在其中添加一个计算列。我要设置的查询比标准算术运算更复杂,我不确定如何使用查询设置计算列。我尝试使用 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)

4

2 回答 2

3

可以使用小技巧(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
于 2020-03-23T14:30:04.793 回答
2

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

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

所以不可能有 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
于 2018-01-24T12:57:56.260 回答