Как установить вычисляемый столбец, используя подзапрос

У меня есть таблица, в которую я хотел бы добавить вычисляемый столбец. Запрос, который я хочу установить, является более сложным, чем стандартная арифметическая операция, и я не уверен, как настроить вычисляемый столбец с помощью запроса. Я попытался использовать инструкцию 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)

1 ответ

Решение

Невозможно иметь вычисляемый столбец с подзапросом,

Вычисляемый столбец вычисляется из выражения, которое может использовать другие столбцы в той же таблице.

Таким образом, невозможно получить запрос, но вы можете использовать выражения как

ColumnA-ColumnB+ColumnC

Вместо этого вы можете конвертировать его в значения View и Compute The Column.

Как это

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

Можно добавить подзапрос с небольшим трюком (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
Другие вопросы по тегам