Создать процедуру для создания таблицы, объединяющей разные таблицы, где таблицы могут иметь повторяющиеся строки - PullRequest
0 голосов
/ 14 мая 2018

У меня есть три таблицы T1, T2 и T3 с каждой таблицей как bpm_no, общей для всех таблиц.Таблица T1 является основной таблицей.T1 есть каждая строка с уникальным bpm_no (не повторяется).Таблица T2 включает в себя два столбца, один - bpm_no, а другой - user, здесь один bpm_no может встречаться несколько раз, когда разные пользователи работают над одним и тем же bpm_no.Таблица T3 включает в себя два столбца: один - bpm_no, а другой - total_outstanding, здесь также один bpm_no может встречаться несколько раз с разными total_outstanding, поскольку один bpm_no может иметь разные непогашенные в разных банках.

Теперь я должен написать процедуру, которая создаст таблицу с использованием всех вышеперечисленных таблиц (внутреннее объединение), и она должна включать три столбца, один из которых будет содержать bpm_no (уникальный для каждой строки), другойс пользователями, разделенными запятыми для каждого отдельного bpm_no, и последним столбцом с суммой total_outstanding.Идея состоит в том, чтобы иметь конечную таблицу с каждым bpm_no как уникальным и его результирующие значения с разделенной запятой и заимствовать как сумму.

Я пытался использовать Views, но он не будет работать, так как в этом случае мне придется создавать много просмотров.Пожалуйста, предложите другие способы.

Ниже приведена структура таблицы для лучшего понимания:

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       |
|---------------------|------------------|------------------|

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Если вы уже используете 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];
0 голосов
/ 14 мая 2018

Попробуйте это ...

Сценарий таблицы и пример данных

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 

Примечание: Если вы хотите получить значения (включая нулевые значения) для всех bpm_no в T1 основной таблице, используйте левое соединение вместо внутреннего соединения.

Запрос (Тот же ожидаемый результат без основной таблицы T1)

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

Если меня неправильно поняли, пожалуйста, дайте мне знать.

...