【问题标题】:How to create new column based on condition of another column PROC SQL如何根据另一列PROC SQL的条件创建新列
【发布时间】:2020-12-21 00:04:51
【问题描述】:

我正在尝试使用 SAS 中的 sql 语句根据另一列的条件创建一组新列。但是,使用我当前的代码,只要不满足条件,它就会显示为 Null 值。但我不希望用这些空白来构造新列。有人可以帮忙吗?在实际数据集中,我将几个表连接在一起。

这是一个简化的模拟数据集:

这里是使用的代码:

PROC SQL;
Create table Sales AS 
SELECT 
SUM (CASE WHEN Sub_Category in('Coffee')THEN Previous_Sales END)AS 
Coffee_Sale,
SUM(CASE WHEN Sub_Category in('Tea')THEN Previous_Sales END)AS Tea_Sale,
SUM(CASE WHEN Sub_Category in('Soda')THEN Previous_Sales END)AS Soda_Sale
FROM data
GROUP BY Sub_Category;

我正在尝试采用这种格式:

此代码正在返回:

【问题讨论】:

  • 为什么是 SQL?为什么不使用普通的 SAS 代码?

标签: sql sas


【解决方案1】:

您只需从现有代码中删除 group by

Create table Sales AS 
SELECT SUM (CASE WHEN Sub_Category in('Coffee')THEN Previous_Sales END)AS Coffee_Sale, 
       SUM(CASE WHEN Sub_Category in('Tea')THEN Previous_Sales END)AS Tea_Sale, 
       SUM(CASE WHEN Sub_Category in('Soda')THEN Previous_Sales END)AS Soda_Sale 
   FROM data -- no group by 

您可以为啤酒和水添加相同的 SUMcase 表达式。

【讨论】:

    【解决方案2】:

    使用 PIVOT,this document from Oracle 中的更多详细信息。

    SELECT * FROM
     (SELECT Previous_Sales, Sub_Category
      FROM data)
    PIVOT (
      SUM(Previous_Sales),
      FOR Sub_Category IN ('Coffee', 'Tea', 'Soda')
      )
    

    【讨论】:

    • 不确定 ORACLE 语法对 SAS 问题有何帮助。他们似乎没有使用任何通向 Oracle 或任何其他非 SAS 查询语言的方法。
    【解决方案3】:

    我不会使用 SQL 来解决这个问题,因为您需要硬卡值和变量名称(或使用一些代码生成)。如果您只使用标准 SAS 程序,您的代码将自动调整为新的子类别。

    proc summary data=have nway ;
      class sub_category ;
      var previous_sales ;
      output out=stats sum= ;
    run;
    proc transpose data=stats out=want(drop=_name_) suffix=_sales;
      id sub_category;
      var previous_sales;
    run;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-07
      • 2023-03-25
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      相关资源
      最近更新 更多