SAS - 在 Proc Sql 中添加计算 Column/Variable 创建 Table
SAS - Add Computed Column/Variable in Proc Sql Create Table
在 MS SQL 服务器中,可以在创建 table 语句中定义计算列,例如
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 中的物理 table 上定义计算列。相反,必须为数据创建一个物理基础 table,并为计算列创建一个视图,例如:
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.
另一种方法是使用约束,这意味着一个物理 table,但它确实需要开发人员确保将正确的值实际加载到其中(因此它不会被计算并占用物理磁盘space).
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 服务器中创建 table,那么您可以使用传递语法来创建计算列..
在 MS SQL 服务器中,可以在创建 table 语句中定义计算列,例如
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 中的物理 table 上定义计算列。相反,必须为数据创建一个物理基础 table,并为计算列创建一个视图,例如:
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.
另一种方法是使用约束,这意味着一个物理 table,但它确实需要开发人员确保将正确的值实际加载到其中(因此它不会被计算并占用物理磁盘space).
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 服务器中创建 table,那么您可以使用传递语法来创建计算列..