使用sql如何连接两张表,保留一列的所有值。

问题描述 投票:-1回答:1

表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 join group-by impala
1个回答
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。

(SQL fiddle例子)

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;
© www.soinside.com 2019 - 2024. All rights reserved.