SQL-如何连接具有相同列的2个表并将其水平堆叠

SQL-如何连接具有相同列的2个表并将其水平堆叠,sql,sql-server-2008,Sql,Sql Server 2008,我有两个表格,例如: 第一表: November Account | Name | Segment | Collectibility | Loan Amount | AFDA 1 Billy Corporate 1 5000 200 2 Randy Corporate 2

我有两个表格,例如:

第一表:

November

Account    |    Name     |   Segment    |   Collectibility  |  Loan Amount   | AFDA
1             Billy        Corporate           1                   5000         200
2             Randy        Corporate           2                   8000         1000
3             Stan         Commercial          3                   2000         200
第二张桌子

December

Account    |    Name     |   Segment    |   Collectibility  |  Loan Amount   | AFDA
1             Billy        Corporate           2                   2000         100
2             Randy        Corporate           3                   4000         500
4             Kenny         Small              1                   2000         100
我正在尝试加入表,因此输出将如下所示

Nov_Dec

Account    |    Name     |   Segment_Nov    |   Segment_Dec     |   Collectibility_Nov  |   Collectibility_Dec  |  Loan Amount_Nov  |   Loan Amount_Dec   | AFDA_Nov    | AFDA_DEC
1               Billy           Corporate       Corporate               1                       2                   5000                    2000            200             100
2               Randy           Corporate       Corporate               2                       3                   8000                    4000            1000            500
3               Stan            Commercial      NULL                    3                       NULL                2000                    NULL            200             NULL
4               Kenny           NULL            Small                   NULL                    1                   NULL                    2000            NULL            100
通常,我会迈出漫长的一步来实现这一目标

  • 合并“帐户”列
  • 修改设计,添加新列
  • 根据合并后没有任何重复项的“ACCOUNT”列联接表
  • 有没有像使用子查询这样的解决方法来加快进程?
    谢谢

    按照这种方式,您将得到结果:

        DECLARE @Table1 TABLE(Account INT,Name VARCHAR(10),Segment VARCHAR(10),Collectibility INT,LoanAmount INT,AFDA INT)
        INSERT INTO @Table1 VALUES(1,'Billy','Corporate',1,5000,200)
        INSERT INTO @Table1 VALUES(2,'Randy','Corporate',2,8000,1000)
        INSERT INTO @Table1 VALUES(3,'Stan','Commercial',3,2000,200)
    
        DECLARE @Table2 TABLE(Account INT,Name VARCHAR(10),Segment VARCHAR(10),Collectibility INT,LoanAmount INT,AFDA INT)
        INSERT INTO @Table2 VALUES(1,'Billy','Corporate',2,2000,100)
        INSERT INTO @Table2 VALUES(2,'Randy','Corporate',3,4000,500)
        INSERT INTO @Table2 VALUES(4,'Kenny','Small',1,2000,100)
    
        SELECT COALESCE(T1.Account,T2.Account)Account,COALESCE(T1.Name,T2.Name)Name
            ,MAX(T1.Segment)Segment_Nov,MAX(T2.Segment)Segment_Dec
            ,MAX(T1.Collectibility)Collectibility_Nov,MAX(T2.Collectibility)Collectibility_Dec
            ,MAX(T1.LoanAmount)LoanAmount_Nov,MAX(T2.LoanAmount)LoanAmount_Dec
            ,MAX(T1.AFDA)AFDA_Nov,MAX(T2.AFDA)AFDA_Dec
        FROM @Table1 T1
        FULL JOIN @Table2 T2 ON T1.Account=T2.Account
        GROUP BY COALESCE(T1.Account,T2.Account),COALESCE(T1.Name,T2.Name)
        ORDER BY COALESCE(T1.Account,T2.Account)
    
    结果:

    Account     Name       Segment_Nov Segment_Dec Collectibility_Nov Collectibility_Dec LoanAmount_Nov LoanAmount_Dec AFDA_Nov    AFDA_Dec
    ----------- ---------- ----------- ----------- ------------------ ------------------ -------------- -------------- ----------- -----------
    1           Billy      Corporate   Corporate   1                  2                  5000           2000           200         100
    2           Randy      Corporate   Corporate   2                  3                  8000           4000           1000        500
    3           Stan       Commercial  NULL        3                  NULL               2000           NULL           200         NULL
    4           Kenny      NULL        Small       NULL               1                  NULL           2000           NULL        100
    

    您可以首先
    UNION
    不同表的结果,然后执行条件聚合以透视每个月的数据:

    SELECT
        Account,
        Name,
        MAX(CASE WHEN m = 'Nov' THEN Segment END) AS Segment_Nov,
        MAX(CASE WHEN m = 'Dec' THEN Segment END) AS Segment_Dec,
        MAX(CASE WHEN m = 'Dec' THEN Collectibility END) AS Collectibility_Nov,
        MAX(CASE WHEN m = 'Dec' THEN Collectibility END) AS Collectibility_Dec,
        MAX(CASE WHEN m = 'Dec' THEN LoanAmount END) AS LoanAmount_Nov,
        MAX(CASE WHEN m = 'Dec' THEN LoanAmount END) AS LoanAmount_Dec,
        MAX(CASE WHEN m = 'Dec' THEN AFDA END) AS AFDA_Nov,
        MAX(CASE WHEN m = 'Dec' THEN AFDA END) AS AFDA_Dec
    FROM
    (
        SELECT Account, Name, Segment, Collectibility, LoanAmount, AFDA, 'Nov' AS m
        FROM Table1
    
        UNION ALL
    
        SELECT Account, Name, Segment, Collectibility, LoanAmount, AFDA, 'Dec' AS m
        FROM Table2
    ) AS t
    GROUP BY
        Account,
        Name;
    

    您如何区分11月份的细分市场和12月份的细分市场?您的任何表中都没有日期。@cdaiga根据表名,每个月的每一天结束时,我们都会从数据仓库中提取数据,我试图分析贷款催缴等级的变化、段的变化等,但这并不能回答我的问题。什么属性将日期存储在您的表中?@Ghozianpribadi,试试我的答案。希望对你有帮助。谢谢!它起作用了!我仍在努力理解这些查询,因为我以前从未使用过!嗨,迪内什,我只是想问一下,如果我有3张桌子,我还能用COALESCE(T1,T2,T3)等吗@dineshDB@Ghozianpribadi,是的,您可以使用它,
    COALESCE
    返回第一个NOTNULL列。