簡體   English   中英

SAS-在Proc Sql創建表中添加計算列/變量

[英]SAS - Add Computed Column/Variable in Proc Sql Create Table

在MS SQL Server中,可以在create 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的物理表上定義計算列。 相反,必須為數據創建一個物理基表,並為計算列創建一個視圖,例如,如下所示:

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中創建表,則可以使用傳遞語法來創建計算列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM