2011-01-20 11 views
4

SQLビューが新しくなったので、やさしくなりましょう!SQLビューでの式

私は、次のSQLビューがあります。

SELECT  dbo.product.name AS [Product Name], 
       ROUND(CASE [vat] WHEN 1 THEN [packcost] * 1.2 ELSE [packcost] END, 2) AS [Pack Cost],    
       ROUND(CASE [vat] WHEN 1 THEN ([packcost] * 1.2)/[units] ELSE [packcost]/[units] END, 2) AS [Unit Cost], 
       dbo.purchase.unitsaleprice * dbo.product.units AS [ Pack Sale Price], dbo.purchase.unitsaleprice AS [Unit Sale Price], 
       dbo.product.units * (dbo.purchase.unitsaleprice - ROUND(CASE [vat] WHEN 1 THEN ([packcost] * 1.2)/[units] ELSE [packcost]/[units] END, 2)) AS [Pack Profit], 
       dbo.purchase.unitsaleprice - ROUND(CASE [vat] WHEN 1 THEN ([packcost] * 1.2)/[units] ELSE [packcost]/[units] END, 2) AS [Unit Profit] 
      FROM dbo.product INNER JOIN 
       dbo.purchase ON dbo.product.id = dbo.purchase.productID 

をしかし、私はこれの多くを書き換えていて、それは非効率です。

例えばIは、[パックの費用]列を定義したい:

ROUND(CASE [vat] WHEN 1 THEN [packcost] * 1.2 ELSE [packcost] END, 2) AS [Pack Cost] 

は、それを書き換えるelswhere代わりに使用します。

例えば、私は使用することができます:それは私もスティックの右端を取得、またはかどうかだ場合

ROUND(CASE [vat] WHEN 1 THEN ([packcost] * 1.2)/[units] ELSE [packcost]/[units] END, 2) AS [Unit Cost] 

わからない:

[Pack Cost]/[Units] 

は、代わりに単価を定義するにはこれを行うには適切です。

答えて

3

次のように新しいユーザー定義スカラ値関数を作成します。次のようにクエリで

CREATE FUNCTION [dbo].[GetPackCost] 
(
    @vat int 
    ,@packcost decimal 
) 
RETURNS decimal 
AS 
BEGIN 
    DECLARE @packcost_calculated decimal 

    SELECT @packcost_calculated = ROUND(CASE @vat WHEN 1 THEN @packcost * 1.2 ELSE @packcost END, 2) 

    RETURN @packcost_calculated 

END 

GO 

を、あなたが選択することになりは次のとおりです。

無感覚であることが申し訳
SELECT  dbo.product.name AS [Product Name], 
       dbo.GetPackCost([vat],[packcost]) AS [Pack Cost],    
       dbo.GetPackCost([vat],[packcost])/[units] AS [Unit Cost], 
       dbo.purchase.unitsaleprice * dbo.product.units AS [ Pack Sale Price], dbo.purchase.unitsaleprice AS [Unit Sale Price], 
       dbo.product.units * (dbo.purchase.unitsaleprice - ROUND(CASE [vat] WHEN 1 THEN ([packcost] * 1.2)/[units] ELSE [packcost]/[units] END, 2)) AS [Pack Profit], 
       dbo.purchase.unitsaleprice - ROUND(CASE [vat] WHEN 1 THEN ([packcost] * 1.2)/[units] ELSE [packcost]/[units] END, 2) AS [Unit Profit] 
      FROM dbo.product INNER JOIN 
       dbo.purchase ON dbo.product.id = dbo.purchase.productID 
2

あなたはそのロジックを実行したスカラー関数を作成できます。次に、ビュー内の関数を呼び出すことができます。

+0

- あなたは私を与えることができますいくつかのポインタ? [Pack Cost]を返す関数を作成しますか? – Ben

1

計算ロジックを使用して中間ビューを作成します。それを(例えば)ProductExと呼んでください。このビューには、あなたのために計算され、名前が付けられたPackCost列を持つことができます。次に、他のすべてのビューをテーブルProductの代わりにProductExビューに対して書き込みます。

0

私の経験では、単純な計算を実行するコストと比較して、行を取得するための「コスト」がそれほど大きくないことがあります。 私は、可読性や抽象化がより重要であると言います。

さらに、dbmsがすでにその最適化を実行している可能性がありますが、両方の方法で確実に測定する必要があります。

1

あなたは、

SELECT p.name AS [Product Name], 
P.[Pack Cost] AS [Pack Cost], 
Round(P.[Pack Cost]/[units],2) AS [Unit Cost], 
dbo.purchase.unitsaleprice * p.units AS [ Pack Sale Price], dbo.purchase.unitsaleprice AS [Unit Sale Price], 
p.units * (dbo.purchase.unitsaleprice - Round(P.[Pack Cost]/[units],2)) AS [Pack Profit], 
dbo.purchase.unitsaleprice - Round(P.[Pack Cost]/[units],2) AS [Unit Profit] 
FROM 
(SELECT *, [Pack Cost] = ROUND(CASE [vat] WHEN 1 THEN [packcost] * 1.2 ELSE [packcost] END, 2) FROM dbo.product) p 
INNER JOIN dbo.purchase ON p.id = dbo.purchase.productID 
0

代わりにサブクエリでそれを定義することができますが、多くの場合、計算をやっているウィル場合は、PackCostと呼ばれるorginalテーブルに言うアサーションのフィールドを追加することができます。 caclisはデータ入力時にのみ実行されるか、すべてのクエリでは変更されません。

関連する問題