SQL视图中的表达式
我不熟悉SQL视图,所以请温柔一点 我有以下SQL视图:SQL视图中的表达式,sql,sql-server,view,Sql,Sql Server,View,我不熟悉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
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
但它似乎效率低下,因为我重写了很多
例如,我想定义[Pack Cost]列:
ROUND(CASE [vat] WHEN 1 THEN [packcost] * 1.2 ELSE [packcost] END, 2) AS [Pack Cost]
用于其他地方,而不是重写它
e、 g因此我可以使用:
[Pack Cost] / [Units]
要定义单位成本而不是:
ROUND(CASE [vat] WHEN 1 THEN ([packcost] * 1.2) / [units] ELSE [packcost] / [units] END, 2) AS [Unit Cost]
但是,我不确定我是否得到了正确的结果,或者这样做是否合适。您可以创建一个标量函数来为您实现该逻辑。然后您可以在视图中调用该函数。使用计算逻辑创建一个中间视图。例如,将其称为ProductEx。此视图可以计算PackCost列并为其命名。然后根据视图ProductEx而不是表Product编写所有其他视图。我的经验是,与执行简单计算的成本相比,获取行的“成本”非常大,我根本不关心它。 我想说可读性和/或抽象性更值得关注
另外,您的dbms可能已经在幕后执行了这些优化,但您应该对这两种方法进行测量以确保其正确性。您可以在子查询中定义它
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
或者,如果要经常进行计算,可以向原始表中添加一个计算字段,称为PackCost。然后,caclis只在数据输入时执行,或者不在每次查询时进行更改。创建一个新的用户定义标量值函数,如下所示:
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
在您的查询中,您将选择如下:
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
对不起,我麻木了,你能再给我一些建议吗?我会创建一个返回[Pack Cost]的函数吗?