Sql 左连接并合并多个变量

Sql 左连接并合并多个变量,sql,sas,Sql,Sas,我有3个数据集: A包含变量期间、地区、城市 B包含变量期间、城市、销售1、销售2、销售3 C包含变量期间、地区、销售1、销售2、销售3 样本数据集包括: **A:** Period City Region 1 A North 2 B South 3 C East **B:** Period City Sales1 Sales2 Sales3

我有3个数据集:

  • A
    包含变量期间、地区、城市
  • B
    包含变量期间、城市、销售1、销售2、销售3
  • C
    包含变量期间、地区、销售1、销售2、销售3
样本数据集包括:

  **A:**
  Period    City   Region
  1          A      North
  2          B      South
  3          C      East

  **B:**
  Period    City    Sales1    Sales2    Sales3
   1         A        12        13        14
   2         B         1         2         3

  **C:**
  Period    Region   Sales1    Sales2    Sales3
   1         North     6        7         8
   2         South     3        2         5
Sales1
Sales2
Sales3
B
C
的相同变量

我的目标是将数据集
B
C
左连接到
A
,以获得所需的销售信息
sales1
sales2
sales3

但是,我只知道如何使用1个变量进行左连接和合并


我的问题是,对于接下来的几个变量
sales2
sales3

您的查询可以简化为:

proc sql;

     create table merged1 as
     select A.*,
     coalesce (b.sales1, c.sales1) as sales1,
     coalesce (b.sales2, c.sales2) as sales2,
     coalesce (b.sales3, c.sales3) as sales3

from A
     left join B on A.period=B.period and A.city=B.city
     left join C on A.period= C.period and A.region=C.region;
quit;
输出:

 Period=1 City=A Region=North sales1=12 sales2=13 sales3=14 
 Period=2 City=B Region=South sales1=1 sales2=2 sales3=3 
 Period=3 City=C Region=East sales1=. sales2=. sales3=.
另一个选项是使用
proc transpose
对所有表进行转置,这样销售额将在行中,城市/地区将在列中

使用的数据:

data A;
input
Period    City $   Region $ ;
datalines;
  1          A      North
  2          B      South
  3          C      East
;
run;
data B;
input
  Period    City  $  Sales1    Sales2    Sales3 ;
  datalines;
   1         A        12        13        14
   2         B         1         2         3
;
run;
data C;
input
  Period    Region $  Sales1    Sales2    Sales3 ;
  datalines;
   1         North     6        7         8
   2         South     3        2         5
   ;
run;

您的查询可以简化为:

proc sql;

     create table merged1 as
     select A.*,
     coalesce (b.sales1, c.sales1) as sales1,
     coalesce (b.sales2, c.sales2) as sales2,
     coalesce (b.sales3, c.sales3) as sales3

from A
     left join B on A.period=B.period and A.city=B.city
     left join C on A.period= C.period and A.region=C.region;
quit;
输出:

 Period=1 City=A Region=North sales1=12 sales2=13 sales3=14 
 Period=2 City=B Region=South sales1=1 sales2=2 sales3=3 
 Period=3 City=C Region=East sales1=. sales2=. sales3=.
另一个选项是使用
proc transpose
对所有表进行转置,这样销售额将在行中,城市/地区将在列中

使用的数据:

data A;
input
Period    City $   Region $ ;
datalines;
  1          A      North
  2          B      South
  3          C      East
;
run;
data B;
input
  Period    City  $  Sales1    Sales2    Sales3 ;
  datalines;
   1         A        12        13        14
   2         B         1         2         3
;
run;
data C;
input
  Period    Region $  Sales1    Sales2    Sales3 ;
  datalines;
   1         North     6        7         8
   2         South     3        2         5
   ;
run;

sales1
(和
sales2
等)列在表
B
C
中的含义是否相同?你能给我们看一些样品数据吗?假设您需要这种逻辑,那么您当前的
coalesce()
没有问题。嗨,是的,他们的意思是一样的,我想知道是否有一种快速的方法来为sales2和sales3的其余部分执行合并功能。随着sales变量数量的增加,代码将变得非常长和乏味。请问将这两个
sales1
列为单独的列,然后在这两个列上使用
coalesce()
有什么意义?您想要实现什么?我试图通过地理位置按粒度级别将销售信息与原始数据集相匹配。如果城市中的第一级粒度无法匹配,那么我会通过区域级匹配采用更聚合的形式。当您说“聚合”时,我感觉您可能应该使用
分组方式
,并且您当前的查询没有反映您实际需要的逻辑。也许可以用一些示例数据和输出更新您的问题以使其更清楚。
sales1
(和
sales2
,等等)列在表
B
C
中的含义是否相同?你能给我们看一些样品数据吗?假设您需要这种逻辑,那么您当前的
coalesce()
没有问题。嗨,是的,他们的意思是一样的,我想知道是否有一种快速的方法来为sales2和sales3的其余部分执行合并功能。随着sales变量数量的增加,代码将变得非常长和乏味。请问将这两个
sales1
列为单独的列,然后在这两个列上使用
coalesce()
有什么意义?您想要实现什么?我试图通过地理位置按粒度级别将销售信息与原始数据集相匹配。如果城市中的第一级粒度无法匹配,那么我会通过区域级匹配采用更聚合的形式。当您说“聚合”时,我感觉您可能应该使用
分组方式
,并且您当前的查询没有反映您实际需要的逻辑。也许可以用一些示例数据和输出更新您的问题,使其更清楚。