它不可能在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