2017-02-17 45 views
2

計算された列に計算を考慮することはできません。だから私はneccessarily重要なアレント、次のデータ列を、持っているが、参照される他の列は、標準的な非計算列あるだけで(あなたは私がやっているものを理解してSQL Server:計算された列の結果が別の計算された列に使用されている

"is not allowed to be used in another computed-column definition." 

:私は、次のエラーとハードウェアを見つけました):

HardwareAssetDepreciableValue AS CONVERT(DECIMAL(7,2),HardwareAssetPurchaseValue - 
HardwareAssetSalvageValue) 

HardwareAssetLifeSpan AS CONVERT(DECIMAL(6,2),DATEDIFF(day,HardwareAssetDateInstalled, 
HardwareAssetEndOfLifeDate))/365 

それらはすべて計算し、期待通りの仕事、私は最高の状態で、計算の複雑セットがあるとの問題を抱えて、しかし誰もがお勧めかの問題を解決する選択肢を助けることができるかどうか疑問に思ってしかし、何複数の計算カラム。

私のクエリは次のとおりです。

HardwareAssetAccumulatedDepreciationValue AS CASE WHEN HardwareAssetDepreciationMethodID 
= '1' THEN CONVERT(DECIMAL(7,2),((HardwareAssetDepreciableValue/HardwareAssetLifeSpan) 
/365)) WHEN HardwareAssetDepreciationMethodID = '2' THEN CONVERT(DECIMAL(7,2), 
HardwareAssetAccumulatedDepreciationValue + ((1.5 *(1/HardwareAssetLifeSpan))* 
HardwareAssetBookValue)/365) ELSE CONVERT(DECIMAL(7,2), 
HardwareAssetAccumulatedDepreciationValue + ((2 *(1/HardwareAssetLifeSpan)) 
*HardwareAssetBookValue)/365) END 

任意のヘルプまたはアドバイスは歓迎です!

答えて

2

あなたが別の列の値を計算する計算列を使用していると、このエラーis not allowed to be used in another computed-column definition.が発生し...

あなたが計算列

HardwareAssetDepreciableValue

の下に持っている。そしてあなたは、に同じを使用しているようです計算下の列を計算する

THEN CONVERT(DECIMAL(7,2),((HardwareAssetDepreciableValue/HardwareAssetLifeSpan) 
/365)) 

あなたはそうしてはいけません。代わりに、あなたsh計算列が適しています現時点では、ベース計算

but wondering if anyone can suggest or help with alternatives to resolving the issue of multiple computed columns.

を使用し、何より良い代替手段が存在しない、私は考えることができ一つの解決策は、ベーステーブルを照会するための図であり、既存の計算値にすでに

+0

ありがとう同じ結果を得るためにビューを使用してくれてありがとう – TheTechnicalPaladin

1

を使用ウルドIMHO。

ちょっとしたもののために、私はスカラーユーザー定義関数を作成し、その中に「ミニロジック」をラップするのが好きです。

ここには簡単なノースウィンドの例があります。それは霊感的な感覚をたくさん作るわけではありませんが、実証しています。

今、私は以下のudfExampleUdfTwoDoubleUdfOneのアイディアが嫌いです。しかしそれはあなたのために働くことができます。

それはツールの武器のためのアイデアです。あなたが別のアイデアを求めたからです。

Use Northwind 
GO 

create function dbo.udfExampleUdfOne(@OrderID as int, @ProductID int, @UnitPrice money) 
     returns int 
as 
begin 

declare @returnValue int = 0 

select @returnValue = ISNULL(@OrderID,0) + ISNULL(@ProductID,0) + ISNULL(@UnitPrice,0) 


return @returnValue; 

end; 

GO 

create function dbo.udfExampleUdfTwoDoubleUdfOne(@udfOneResult int) 
     returns int 
as 
begin 

declare @returnValue int = 0 

select @returnValue = ISNULL(@udfOneResult,0) * 2 


return @returnValue; 

end; 


GO 

SELECT TOP 1000 [OrderID] 
     ,[ProductID] 
     ,[UnitPrice] 
     ,[Quantity] 
     ,[Discount] 
     , MyValueOne = dbo.udfExampleUdfOne(OrderID , ProductID , UnitPrice) 
     , MyValueTwoWhichIsActuallyDoubleValueOne = dbo.udfExampleUdfTwoDoubleUdfOne(dbo.udfExampleUdfOne(OrderID , ProductID , UnitPrice)) 
    FROM [Northwind].[dbo].[Order Details] 

APPEND

だから、その後、あなたのHardwareAssetAccumulatedDepreciationValue IF/THEN/CASEロジックをカプセル化する第三UDFを書く

create function dbo.udfComputeHardwareAssetDepreciableValue(@HardwareAssetPurchaseValue int, @HardwareAssetSalvageValue int) 
     returns int 
as 
begin 

declare @returnValue int = 0 

select @returnValue = ISNULL(@HardwareAssetPurchaseValue,0) - ISNULL(@HardwareAssetSalvageValue,0) 


return @returnValue; 

end; 



create function dbo.udfComputeHardwareAssetLifeSpan(@HardwareAssetDateInstalled int, @HardwareAssetEndOfLifeDate int) 
     returns int 
as 
begin 

declare @returnValue int = 0 

select @returnValue = CONVERT(DECIMAL(6,2),DATEDIFF(day,@HardwareAssetDateInstalled, 
@HardwareAssetEndOfLifeDate))/365 


return @returnValue; 

end; 

あなたの例を模倣しようとしています。

あなたは計算された列を新しいudfComputeHardwareAssetAccumulatedDepreciationValue関数に渡すこともできます。

あなたが新しくても、RBAR/CURSORSを避ける​​ための最良のツールとして、このコンセプトに苦労する必要があります。

https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx

はい、その非常に古いが、簡単なデモはそれから作成することができます。

現在地からのNorthwindデータベースを得ることができます。

+0

正直言って、私があなたが提供してくれた例は、おそらくまだ初心者の方には当然のことですが、本当に感謝しています。あなたが手助けしてくれたものと、それを今後どのように活用できるかを理解する時間を探してみましょう。 – TheTechnicalPaladin

+0

あなたは基本的に、あなたが必要とする情報..........関数はそれらの入力値を取り、単一の出力値を計算し、その値を返します。あなたはそれを通常のselectステートメントと一緒に呼び出すので、それはまともに実行されます。私は私の答えをいくつか追加しました。 – granadaCoder

0

あなたは列のユーザー定義関数の両方が、私はそれを探しているが、最終的に得られた、機能はND NONコンピュー計算のすべての列にアクセスすることができますすることができます...

は、私が見ていきます

関連する問題