它不可能在SAS的物理表定义计算列。相反,一个必须创建该数据的物理基表,和用于计算列的图,例如,如下:
proc sql;
create table work.products_base
(
ProductID num
,QtyAvailable num
,UnitPrice num format euro8.2
);
CREATE view work.Products as
select
ProductID
,QtyAvailable
,UnitPrice
,QtyAvailable * UnitPrice as InventoryValue
from work.products_base;
insert into work.products
set productid=1, qtyavailable=2,unitprice=3;
尝试为InventoryValue添加一个值抛出一个警告:
169 set productid=1, qtyavailable=2,unitprice=3, inventoryvalue=4;
WARNING: Cannot provide InventoryValue with a value because it references a derived
column that can't be inserted into.
另一种方法是使用一个约束,这意味着一个物理表,但它确实需要开发者确保正确的值被真正加载到它(所以它不被计算并占用物理磁盘空间)。
proc sql; drop table work.products;
create table work.products_base
(
ProductID num
,QtyAvailable num
,UnitPrice num format euro8.2
,InventoryValue num
,constraint InventoryValue check(InventoryValue = QtyAvailable * UnitPrice)
);
insert into work.products_base set qtyavailable=2,unitprice=2,inventoryvalue=4;
insert into work.products_base set qtyavailable=2,unitprice=2,inventoryvalue=2;
第二INSERT语句抛出一个错误:
ERROR: Add/Update failed for data set WORK.PRODUCTS_BASE because data value(s) do not comply
with integrity constraint InventoryValue.
当然 - 如果你实际上是在SQL Server中创建表,那么你可以使用通过语法来创建计算列..
我已经 - 但它也不工作:(它适用于选择语句,但不适用于创建一个空表 – kristof
道歉 - 我误解了 - 2分钟,会看看 –
谢谢@allan我想这个公式被定义在元数据上因此如果您要创建SAS表,则不要将数据插入InventoryValue – kristof