计算列基于插入过程中的其他计算列
Computed column based on other computed column within insert procedure
我正在创建一个简单的数据库,其中包含允许我(使用 excel)分析我的冷水、温水、电费等消耗量以及这些消耗量的数据。
我将在 excel 中使用 useforms 将数据插入数据库,因此我创建了一个 SQL 过程。下面是插入冷水数据的例子。
我正在向程序传递两个重要参数:@Price 和@Reading。
在 table [冷水] 我还有专栏:消耗和成本。
我想做的是首先计算当月的消耗量(作为实际的@Reading - 以前的读数)。然后,计算电流消耗后,我想使用这个值并计算成本(电流消耗 * @Price)。
我已经设法使用子查询计算当前消耗和成本。但我很好奇是否(如果可能的话如何)我是否可以直接使用尚未插入的计算值(当前消耗)来计算一次插入中的另一个值(成本),而不是使用子查询。
我唯一想到的想法是编写一个在此插入后执行的触发器。
我也不知道如何使用此过程将第一行插入 table 而不是手动插入第一行。
如有任何提示,我将不胜感激。
@Date AS DATE,
@Reading AS DECIMAL (6,3),
@Price AS DECIMAL (6,2),
@Unit AS VARCHAR (5)
AS
BEGIN
SET NOCOUNT ON
-- Cold water
IF NOT EXISTS
(
SELECT Date
FROM [Cold water]
WHERE Date = @Date
)
BEGIN
INSERT INTO dbo.[Cold water]
(
Date,
Year,
Month,
Day,
Reading,
Consumption,
Unit,
Price,
Cost
)
VALUES
(
@Date,
(SELECT YEAR(@Date)),
(SELECT MONTH(@Date)),
(SELECT DAY(@Date)),
@Reading,
(SELECT
(@Reading - (SELECT Reading FROM [Cold water] WHERE ID = (SELECT MAX(ID) FROM [Cold water]))
)
),
@Unit,
@Price,
(SELECT @Price* (SELECT (@Reading - (SELECT Reading FROM [Cold water] WHERE ID = (SELECT MAX(ID) FROM [Cold water])
)
)
)
)
)
END
您可以使用 insert . . . select
做您想做的事:
INSERT INTO dbo.[Cold water](Date, Year, Month, Day, Reading,
Consumption, Unit, Price, Cost)
SELECT @Date, YEAR(@Date), MONTH(@Date), DAY(@Date), @Reading,
c.Consumption, @Unit, @Price, @Price * c.Consumption
FROM (SELECT (@Reading - Reading) as Consumption
FROM [Cold water]
WHERE ID = (SELECT MAX(ID) FROM [Cold water])
) c;
一些评论:
- 您过度使用嵌套选择。仅应用功能不需要这些。
- 如果要存储日期,则不需要存储日期组件。这就是数据库包含
year()
和 month()
. 等函数的原因
cost
的计算最好作为计算列来完成。
编辑:
您可以将计算列添加为:
alter table dbo.[Cold water] add year as (year(date));
或:
alter table dbo.[Cold water] add cost as (unit * price);
对于 Excel,这些将显示为真正的专栏。我建议对所有可以计算的列使用此逻辑。
我正在创建一个简单的数据库,其中包含允许我(使用 excel)分析我的冷水、温水、电费等消耗量以及这些消耗量的数据。
我将在 excel 中使用 useforms 将数据插入数据库,因此我创建了一个 SQL 过程。下面是插入冷水数据的例子。
我正在向程序传递两个重要参数:@Price 和@Reading。 在 table [冷水] 我还有专栏:消耗和成本。
我想做的是首先计算当月的消耗量(作为实际的@Reading - 以前的读数)。然后,计算电流消耗后,我想使用这个值并计算成本(电流消耗 * @Price)。
我已经设法使用子查询计算当前消耗和成本。但我很好奇是否(如果可能的话如何)我是否可以直接使用尚未插入的计算值(当前消耗)来计算一次插入中的另一个值(成本),而不是使用子查询。
我唯一想到的想法是编写一个在此插入后执行的触发器。 我也不知道如何使用此过程将第一行插入 table 而不是手动插入第一行。
如有任何提示,我将不胜感激。
@Date AS DATE,
@Reading AS DECIMAL (6,3),
@Price AS DECIMAL (6,2),
@Unit AS VARCHAR (5)
AS
BEGIN
SET NOCOUNT ON
-- Cold water
IF NOT EXISTS
(
SELECT Date
FROM [Cold water]
WHERE Date = @Date
)
BEGIN
INSERT INTO dbo.[Cold water]
(
Date,
Year,
Month,
Day,
Reading,
Consumption,
Unit,
Price,
Cost
)
VALUES
(
@Date,
(SELECT YEAR(@Date)),
(SELECT MONTH(@Date)),
(SELECT DAY(@Date)),
@Reading,
(SELECT
(@Reading - (SELECT Reading FROM [Cold water] WHERE ID = (SELECT MAX(ID) FROM [Cold water]))
)
),
@Unit,
@Price,
(SELECT @Price* (SELECT (@Reading - (SELECT Reading FROM [Cold water] WHERE ID = (SELECT MAX(ID) FROM [Cold water])
)
)
)
)
)
END
您可以使用 insert . . . select
做您想做的事:
INSERT INTO dbo.[Cold water](Date, Year, Month, Day, Reading,
Consumption, Unit, Price, Cost)
SELECT @Date, YEAR(@Date), MONTH(@Date), DAY(@Date), @Reading,
c.Consumption, @Unit, @Price, @Price * c.Consumption
FROM (SELECT (@Reading - Reading) as Consumption
FROM [Cold water]
WHERE ID = (SELECT MAX(ID) FROM [Cold water])
) c;
一些评论:
- 您过度使用嵌套选择。仅应用功能不需要这些。
- 如果要存储日期,则不需要存储日期组件。这就是数据库包含
year()
和month()
. 等函数的原因
cost
的计算最好作为计算列来完成。
编辑:
您可以将计算列添加为:
alter table dbo.[Cold water] add year as (year(date));
或:
alter table dbo.[Cold water] add cost as (unit * price);
对于 Excel,这些将显示为真正的专栏。我建议对所有可以计算的列使用此逻辑。