0

我正在使用 SAS 进行分析。每次分析后,我都会得到四张表。Table11, Table12,Tabe21Table22. 每张桌子只有一个号码。我想将这四个数字(来自四个表)放入一个 2x2 矩阵中。我怎样才能使用 SAS 做到这一点proc sql

例如,当我有1(表 1 中唯一的数字)、2(表 2 中唯一的数字)、3(表 3 中的唯一数字)、4(表 4 中的唯一数字)时,我想生成一个 2 x 2 表格的另一个表格,里面有这四个数字。

4

4 回答 4

4

一个完全 hacky、可怕的方法可能看起来像这样:

SELECT (SELECT num FROM table1), (SELECT num FROM table2)
    UNION ALL 
SELECT (SELECT num FROM table3), (SELECT num FROM table4)

您可能必须在联合的每个部分之后添加一个“虚拟”表(就像SELECT ... FROM sysibm.sysdummy1在 DB2 中一样)。

我从来没有使用过SAS,所以我不知道具体情况。也许那个(标准 SQL)解决方案对你有用。但就像我说的那样,它非常hackish,所以可能有更好的方法来做到这一点。

于 2012-08-16T04:04:46.077 回答
2

可能具有等效的执行计划(使用隐式交叉连接):

SELECT table11.num, table12.num
FROM table11, table12
    UNION ALL 
SELECT table21.num, table22.num
FROM table21, table22
于 2012-08-16T04:09:49.557 回答
0

您已经收到了上面的一些好点/解决方案,但是您可能希望在加入之前尝试自动检查每个数据集是否存在。类似于以下内容:

data c12;
c12=32;
run;

data c21;
c21=40;
run;

data c22;
c22=12;
run;

%sysfunc(ifc(%sysfunc(exist(c11)),
             proc print data = a; run;,
             data _null_; file print; put 'Dataset "c11: was not created'; run;))
于 2012-08-18T03:18:09.317 回答
0

显然,您想采用工作保障技术。

with
    t11(r, c, num) as (SELECT 1, 1, num from table11),
    t12(r, c, num) as (SELECT 1, 2, num from table12),
    t21(r, c, num) as (SELECT 2, 1, num from table21),
    t22(r, c, num) as (SELECT 2, 2, num from table22)
select
    coalesce(t11.num, t21.num) as col1,
    coalesce(t12.num, t22.num) as col2
from 
    (t11 cross join t12)
    full outer join
    (t21 cross join t22)
        on t11.r = t21.r or t12.r = t22.r

或者,如果您不想浪费 c 列中的值,这可能会更好。

    case
        when t11.r * t11.c = t12.c - t12.r
        then t11.num else t21.num
    end as col1,
    case
        when t21.r * t22.r * t22.c - t21.c = t21.r + t21.c + t22.r + t22.c
        then t22.num else t12.num
    end as col2
于 2012-08-16T04:35:28.593 回答