Sql SAS-编写包含Do循环的if语句

Sql SAS-编写包含Do循环的if语句,sql,sas,Sql,Sas,我正试图帮助一位同事使用她正在使用的SAS脚本。我是一名程序员,所以我理解逻辑,但是我现在不知道SAS中的语法。基本上这就是她想要做的 我们有: Array of Procedure Dates (proc_date[i]) Array of Procedures (proc[i]). 我们数据中的每条记录最多可以有20个过程和20个日期 i=20 每个过程都有一个相关的代码,比如说有100个不同的代码,其中代码1到10是过程A,11到20是过程B等等 我们需要循环遍历每个过程,如果它属于

我正试图帮助一位同事使用她正在使用的SAS脚本。我是一名程序员,所以我理解逻辑,但是我现在不知道SAS中的语法。基本上这就是她想要做的

我们有:

Array of Procedure Dates (proc_date[i]) 
Array of Procedures (proc[i]).
我们数据中的每条记录最多可以有20个过程和20个日期

i=20
每个过程都有一个相关的代码,比如说有100个不同的代码,其中代码1到10是过程A,11到20是过程B等等

我们需要循环遍历每个过程,如果它属于100个代码中的一个,则为其分配正确的过程类别(即:它输入一个if语句)。如果这是真的,那么我们需要循环遍历该行中彼此对应的过程日期,如果在我们将“加权值”相加时它们是不同的日期,否则我们将只取2个值中的较大值

我希望这有帮助,我希望这是有意义的。我可以用另一种语言(即:C/C++/C#/VB)来写这篇文章,但是我对SAS感到困惑,因为我对语法不太熟悉,而且逻辑似乎与其他OO语言不同

提前感谢您的帮助。
亲切问候。

不管怎样,你都不想做100个
if
语句

问题核心的答案是,您需要if语句之外的
do
循环

data want;
  set have;
  array proc[20];
  array proc_date[20];
  do _i = 1 to dim(proc); *this would be 20;
    if proc[_i] = 53 then ... ;
    else if proc[_i] = 54 then ...;
  end;
run;
现在,您试图对proc_日期执行的操作听起来像是需要在同一循环中对
proc_日期[i]
执行一些操作。循环只是一个迭代器-唯一改变的是用作数组索引的
\u i
。欢迎将其作为任意一个数组的数组索引(或执行任何其他操作)。这就是它不同于普通OOP实践的地方,因为它不是数组类;您没有使用单个对象来迭代它。这是一种函数式语言风格(甚至c也会采用同样的方式)

但是,
if/else
位将很难处理且很长。在SAS中,你有很多方法来处理这个问题。您可能有另一个包含100个值的数组
proc
可以接受,然后在该do循环中有另一个do循环在该数组上迭代(
do\u j=1到100;
)-或者反过来(迭代100,在该循环中迭代20),如果这更有意义(如果您希望一次拥有所有的值)

您还可以使用用户定义的格式,它实际上只是值的一对一映射(
start
value->
label
value)。将您的100个值映射到它们对应的10个程序,或其他任何程序。然后所有100条if语句都变成

proc_value[_i] = put(proc[_i],PROCFMT.);
然后proc_value[_i]存储过程(或任何东西),然后您可以更简单地计算它


您可能还想查看哈希表;既适用于与上述格式类似的概念,也适用于进行存储。哈希表是编程中常见的想法,您可能已经遇到过,SAS实现它们的方式实际上类似于OOP。如果您试图基于过程值进行某种类型的汇总,则可以在哈希表中轻松完成,并且可能比在If语句中更有效。

这里介绍了一些语句

*代码1至10为程序,11至20为程序B

proc format;
value codes 1-10 = 'A'
           11-20 = 'B';

Procedure(i) = put(code,codes.);
另一种重新编码范围的方法是使用between语法

if 1 <= value <= 10 then variable = <new-value>;

如果1,我将为您在问题中试图做的事情编写伪代码,以使其更清楚。感谢您的回答,我们将深入研究,看看是否可以利用您的建议来完成这项工作。我只是不知所措,因为我不完全理解SAS中的语法。
if 1 <= value <= 10 then variable = <new-value>;