表1:
Indicator Basis Period Name Vals
PRE NA 201902 X 1
PRE EX 201902 X 3
PRE IN 201902 X 4
PRI NA 201902 X 1
PRE NA 201903 X 2
PRI NA 201902 Y 2
和表2。
Indicator Basis Period Name Vals
PRE NA 201902 X 2
PRE EX 201902 X 3
PRE IN 201902 Y 2
PRI NA 201902 B 3
PRE NA 201903 C 4
要实现:
T3
Indicator Basis Period Name Vals1 Vals2
PRE NA 201902 X 1 2
PRE EX 201902 X 3 3
PRE IN 201902 X 4 0
PRI NA 201902 X 1 0
PRE NA 201903 X 2 0
PRI NA 201902 Y 2 0
PRE IN 201902 Y 0 2
PRI NA 201902 B 0 3
PRE NA 201903 C 0 4
其中columnn vals1是表1的值,Vals2是表2的值。其中任何一个表在另一个表中没有观测值,它们应该在各自的vals列下有val 0。希望这有意义。
谁能告诉我如何进行连接,以实现以下目的?
我想下面的代码可以满足你的需求,它是用SQL Server写的。使用COALESCE函数填充从第一个表的值或如果是NULL比它从第二个表的值。FULL OUTER JOIN可以保证你得到结果集中的所有行。
如果你的SQL版本中没有COALESCE或类似的函数,你可以用CASE WHEN语句来写,即CASE WHEN t1.Indicator IS NOT NULL THEN t1.Indicator ELSE t2.Indicator END。
CREATE TABLE Table1
( Indicator varchar(10)
, Basis varchar(10)
, Period varchar(10)
, Name varchar(10)
, Vals int
)
INSERT INTO Table1(Indicator, Basis, Period, Name, Vals)
VALUES (' PRE', 'NA', '201902', 'X', 1)
, (' PRE', 'EX', '201902', 'X', 3)
, (' PRE', 'IN', '201902', 'X', 4)
, (' PRI', 'NA', '201902', 'X', 1)
, (' PRE', 'NA', '201903', 'X', 2)
, (' PRI', 'NA', '201902', 'Y', 2);
CREATE TABLE Table2
( Indicator varchar(10)
, Basis varchar(10)
, Period varchar(10)
, Name varchar(10)
, Vals int
)
INSERT INTO Table2(Indicator, Basis, Period, Name, Vals)
VALUES (' PRE', 'NA', '201902', 'X', 2)
, (' PRE', 'EX', '201902', 'X', 3)
, (' PRE', 'IN', '201902', 'Y', 2)
, (' PRI', 'NA', '201902', 'B', 3)
, (' PRE', 'NA', '201903', 'C', 4);
SELECT
COALESCE(t1.Indicator, t2.Indicator) AS Indicator
, COALESCE(t1.Basis, t2.Basis) AS Basis
, COALESCE(t1.Period, t2.Period) AS Period
, COALESCE(t1.Name, t2.Name) AS Name
, COALESCE(t1.Vals, 0) AS Vals1
, COALESCE(t2.Vals, 0) AS Vals2
FROM Table1 AS t1
FULL OUTER JOIN Table2 AS t2
ON t1.Indicator = t2.Indicator
AND t1.Basis = t2.Basis
AND t1.Period = t2.Period
AND t1.Name = t2.Name;