首页 > 解决方案 > 按第一行进行 PROC SQL/SQL 多连接

问题描述

我有 3 个数据集,我希望在第一行加入它们,因为它们处于不同的级别。我将基础数据集指定为(另外 2 个将被连接到基础数据集):

item  state  county  by_county

Apple  MD     aa      4
Apple  DC     bb      3
Apple  DC     cc      2
Pear   VA     cc      6

第二个数据集:

item state  by_state

Apple  MD    4
Apple  DC    5
Pear   VA    6

第三个数据集:

item        by_item

Apple        9
Pear         6

我希望加入数据集以得到如下输出:

item   state  county  by_county   by_state  by_item

Apple   MD     aa     4            4        9
Apple   DC     bb     3            5
Apple   DC     cc     2       
Pear    VA     cc     6            6        6

您可以按项目、州和县排序,以确定第一行。此连接在 SAS 环境中,因此分区方式可能不起作用。(我不确定)

我不能使用左连接,因为我只需要逐级保留一条记录。例如,输出数据集保留缺失,因为我只需要所有州或县的一个项目计数 (by_item)。

出于某种原因,人们坚持我应该发布我知道它不会提供正确结果的查询:

select a*,b*,c*
from table1 as a
left join table2 as b
on a.item = b.item and a.state = b.state
left join table3 as c
on a.item = c.item;

谢谢!

标签: sqljoinsasproc-sql

解决方案


只是考虑问题的另一种方式。如果期望目标表如下所示,那么它甚至不会破坏值的含义。

    item   state  county  value  

    Apple   MD     aa     4      
    Apple   DC     bb     3
    Apple   DC     cc     2
    Pear    VA     cc     6       

    Apple   MD     ANY    4        
    Apple   DC     ANY    5  
    Pear    VA     ANY    6  

    Apple   ANY    ANY    9   
    Pear    ANY    ANY    6       

上述结果可以通过以下方式简单实现UNION ALL

(SELECT 
   item, 
   state, 
   county, 
   by_county as value
 FROM tbl_level3) 
 UNION ALL
(SELECT 
   item, 
   state, 
   "Any" as county, 
   by_state as value
 FROM tbl_level2) 
 UNION ALL 
(SELECT 
   item, 
   "Any" as state, 
   "Any" as county, 
   by_item as value
 FROM tbl_level1);

推荐阅读