创建过程以生成 table 连接不同的 tables 其中 tables 可以重复多行?

Create procedure to produce table joining different tables where tables can have multiple rows repeating?

我有三个 table T1T2T3,每个 table 和 bpm_no 在所有 table秒。 TableT1为主table。 T1 每一行都具有唯一性 bpm_no(不重复)。 Table T2 包括两列,一个是 bpm_no,另一个是 user,这里一个 bpm_no 可以出现多次,不同的用户使用相同的 bpm_no. Table T3包括两列,一个是bpm_no,另一个是total_outstanding,这里还有一个bpm_no可以出现多次,但不同的total_outstanding,如一个 bpm_no 可以有来自不同银行的不同余额。

现在,我必须编写使用上述所有 tables(内连接)构建 table 的过程,它必须包含三列,其中一列将包含 bpm_no(每一行都是唯一的),另一个用户用逗号分隔每个人 bpm_no,最后一列的总和为 total_outstanding。想法是让每个 bpm_no 的结尾 table 都是唯一的,其结果值用逗号分隔,贷款作为总和。

我尝试使用视图,但它不起作用,因为在那种情况下我将不得不创建大量视图。请建议其他方法。

下面是table结构以便更好地理解:

Table T1:
|---------------------|------------------|
|      **bpm_no**     |     **name**     |
|---------------------|------------------|
|      abc_0011       |      john        |
|---------------------|------------------|

Table T2:
|---------------------|------------------|
|      **bpm_no**     |     **user**     |
|---------------------|------------------|
|      abc_0011       |      abc         |
|---------------------|------------------|
|      abc_0011       |      bcd         |
|---------------------|------------------|
|      abc_0011       |      lmn         |
|---------------------|------------------|

Table T3:
|---------------------|------------------|
|      **bpm_no**     |     **loan_os**  |
|---------------------|------------------|
|      abc_0011       |      14,500      |
|---------------------|------------------|
|      abc_0011       |      4000        |
|---------------------|------------------|
|      abc_0011       |      5000        |
|---------------------|------------------|

Final Table required:
|---------------------|------------------|------------------|
|      **bpm_no**     |     **user**     |     **loan_os**  |
|---------------------|------------------|------------------|
|     abc_0011        |   abc,bcd,lmn    |     23,500       |
|---------------------|------------------|------------------|

试试这个...

Table 脚本和示例数据

CREATE TABLE [T1](
    [bpm_no] [nvarchar](50) NULL,
    [name] [nvarchar](50) NULL
) 


CREATE TABLE [T2](
    [bpm_no] [nvarchar](50) NULL,
    [user] [nvarchar](50) NULL
) 


CREATE TABLE [T3](
    [bpm_no] [nvarchar](50) NULL,
    [loan_os] [decimal](18, 0) NULL
) 

INSERT [T1] ([bpm_no], [name]) VALUES (N'abc_0011', N'john')

INSERT [T2] ([bpm_no], [user]) VALUES (N'abc_0011', N'abc')
INSERT [T2] ([bpm_no], [user]) VALUES (N'abc_0011', N'bcd')
INSERT [T2] ([bpm_no], [user]) VALUES (N'abc_0011', N'lmn')

INSERT [T3] ([bpm_no], [loan_os]) VALUES (N'abc_0011', CAST(14500 AS Decimal(18, 0)))
INSERT [T3] ([bpm_no], [loan_os]) VALUES (N'abc_0011', CAST(4000 AS Decimal(18, 0)))
INSERT [T3] ([bpm_no], [loan_os]) VALUES (N'abc_0011', CAST(5000 AS Decimal(18, 0)))

查询

SELECT t1.bpm_no, 
       sq1.[user], 
       sq2.loan_os 
FROM   t1 
       INNER JOIN (SELECT bpm_no, 
                          Stuff((SELECT ', ' + [user] 
                                 FROM   t2 t21 
                                 WHERE  t21.bpm_no = t22.bpm_no 
                                 FOR xml path('')), 1, 2, '') AS [user] 
                   FROM   t2 t22 
                   GROUP  BY bpm_no) sq1 
               ON t1.bpm_no = sq1.bpm_no 
       INNER JOIN (SELECT bpm_no, 
                          Sum(loan_os) AS loan_os 
                   FROM   t3 
                   GROUP  BY bpm_no) sq2 
               ON t1.bpm_no = sq2.bpm_no 

注意:如果要获取 T1 main table 中所有 bpm_no 的值(包括空值),请使用左连接而不是内连接。

查询(没有 T1 main table 的相同预期结果)

SELECT sq1.bpm_no, 
       sq1.[user], 
       sq2.loan_os 
FROM   (SELECT bpm_no, 
               Stuff((SELECT ', ' + [user] 
                      FROM   t2 t21 
                      WHERE  t21.bpm_no = t22.bpm_no 
                      FOR xml path('')), 1, 2, '') AS [user] 
        FROM   t2 t22 
        GROUP  BY bpm_no) sq1 
       INNER JOIN (SELECT bpm_no, Sum(loan_os) AS loan_os 
                   FROM   t3 
                   GROUP  BY bpm_no) sq2 
               ON sq1.bpm_no = sq2.bpm_no 

输出

+----------+---------------+---------+
|  bpm_no  |     user      | loan_os |
+----------+---------------+---------+
| abc_0011 | abc, bcd, lmn |   23500 |
+----------+---------------+---------+

演示:http://www.sqlfiddle.com/#!18/b6362/2/0

如有误会请告知

如果您已经在 SQL Server 2017 上,您可以使用 string_agg() 获取用户列表:

SELECT [T3].[bpm_no],
       [T2].[user],
       [T3].[loan_os]
       FROM (SELECT [T3].[bpm_no],
                    sum([T3].[loan_os]) [loan_os]
                    FROM [T3]
                    GROUP BY [T3].[bpm_no]) T3
            LEFT JOIN (SELECT [T2].[bpm_no],
                              string_agg([T2].[user], ',') [user]
                              FROM [T2]
                              GROUP BY [T2].[bpm_no]) [T2]
                      ON [T2].[bpm_no] = [T3].[bpm_no];