创建过程以生成 table 连接不同的 tables 其中 tables 可以重复多行?
Create procedure to produce table joining different tables where tables can have multiple rows repeating?
我有三个 table T1
、T2
和 T3
,每个 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];
我有三个 table T1
、T2
和 T3
,每个 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];