I have a table to which I would like to add a calculated column. The query I want to set it to is more complex than a standard arithmetic operation and I am unsure how to se
It is possible to add subquery with a little trick (UDF), see my example ([ChildCount] field):
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
It is not possible to have a Computed Column with a Sub Query,
A computed column is computed from an expression that can use other columns in the same table.
So it is not possible to have A Query but you can use Expressions Like
ColumnA-ColumnB+ColumnC
Instead, you can convert it as a View and Compute The Column values there
Like this
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