首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAS - PROC SQL - Sum值为唯一列。

SAS - PROC SQL - Sum值为唯一列。
EN

Stack Overflow用户
提问于 2017-12-01 20:13:58
回答 2查看 2.1K关注 0票数 1

简化我桌子的描述,使我的问题简洁.

我有一个3列的数据集。第一列包含100 成本类别(即唯一键),第二列包含给定成本类别的成本,第三列包含销售的单位。

我的目标是将其转换为一个表,该表包含每个CostCat的列,其中包含该给定类别的成本字段的和,该字段按UnitsSold分组。

代码语言:javascript
复制
╔════════════╦══════════╦══════════╦═══════
║  UnitsSold ║ CatCost1 ║ CatCost2 ║ CostCat...
╠════════════╬══════════╬══════════╬═══════
║    1       ║    50    ║    10    ║ ...
║    2       ║    20    ║    15    ║ ...
║    ...     ║    ...   ║    ...   ║ ...
╚════════════╩══════════╩══════════╩═══════

我倾向于使用这样的代码:

代码语言:javascript
复制
PROC SQL;
CREATE TABLE cartesian AS
SELECT
  UnitsSold,
  SUM(CASE WHEN CostCat=1 THEN Cost else 0 end) as CostCat1,
  sum(case when CostCat=1 then Cost else 0 end) as CostCat2,
  sum(case when CostCat=1 then Cost else 0 end) as CostCat3,
  ...
  sum(case when CostCat=100 then Cost else 0 end) as CostCat100
GROUP BY UnitsSold;
QUIT;

我想知道是否有一种比写出大量荒谬的案例陈述更有效的方法?(显然,使用Excel生成实际的类型)。

我想可能有某种类型的宏循环,但对宏还不太熟悉,还不知道如何实现。

我传统上使用PROC SQL,所以这是我的首选,但也向SAS代码解决方案开放。

EN

Stack Overflow用户

发布于 2017-12-01 21:46:36

正如Reeza所指出的,最好的方法可能是将proc sqlproc means/summaryproc transpose结合起来。我假设您了解SQL,所以我将首先讨论这个描述。

代码语言:javascript
复制
proc sql;
create table tmp as
select UnitsSold, CostCat, sum(cost) as cost
from have
group by UnitsSold, CostCat;
quit;

如果您想通过SAS过程执行此操作,则可以使用proc summary

代码语言:javascript
复制
proc summary data=have nway missing;
class UnitsSold CostCat;
var Cost;
output out=tmp(drop=_:) sum=;  ** drop=_: removes the automatic variables created in the procedure;
run;

既然表已经通过UnitsSoldCostCat进行了总结和排序,那么就可以转到表中了。

代码语言:javascript
复制
proc transpose data=tmp out=want(drop=_NAME_) prefix=CostCat;
by UnitsSold;
id CostCat;
var cost;
run;
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47600847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档