2012-08-16 59 views
0

我正在使用SAS进行分析。每次分析后,我都会得到四张表格。表11,表12,表21和表22。每个表只有一个数字。我想把这四个数字(从四个表格)变成一个2x2矩阵。我怎样才能使用SAS proc sql?例如,当我有1(表1中唯一的数字),2(表格2中唯一的数字),3(表格3中唯一的数字),4(表格4中唯一的数字),我想制作花药桌,里面有一个2比2的桌子,里面有这四个数字。如何将四个表中的四个数字放入一个2乘2表格中?

回答

4

一个完全哈克,可怕的方式做到这一点可能是这个样子:

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)解决方案将为你工作。但就像我说的那样,它非常黑客,所以可能有更好的方法来做到这一点。也许具有同等的执行计划

2

(使用隐式交叉连接):

SELECT table11.num, table12.num 
FROM table11, table12 
    UNION ALL 
SELECT table21.num, table22.num 
FROM table21, table22 
+0

嘿,伙计们,感谢您的大力帮助。这是一个非常聪明的方法。我试过了,它确实有效。 – user1602156 2012-08-16 04:47:25

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 
+0

大声笑,我喜欢这种方法,但你应该重命名你的变量只使用大写字母XXKXKX和大写字母XXKXXKX来利用我们的诵读困难类型 – 2012-08-16 16:53:00

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;)) 
相关问题