SAS - 在 proc sql 创建表中添加计算列/变量



在MS SQL Server中,可以在创建表语句中定义计算列,例如

CREATE TABLE dbo.Products   
(  
ProductID int
, QtyAvailable smallint  
, UnitPrice money  
, InventoryValue AS QtyAvailable * UnitPrice  
);  

SAS proc sql 中是否有等效的选项?

以下引发语法错误:

proc sql;
CREATE TABLE work.Products   
( 
ProductID num
,QtyAvailable num
,UnitPrice num format euro8.2 
, InventoryValue AS QtyAvailable * UnitPrice  
);  
quit;

无法在 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;

第二个插入语句抛出错误:

ERROR: Add/Update failed for data set WORK.PRODUCTS_BASE because data value(s) do not comply
with integrity constraint InventoryValue.

当然 - 如果您实际上是在SQL Server中创建表,则可以使用传递语法来创建计算列。

最新更新