Создать процедуру для создания таблицы, объединяющей разные таблицы, где в таблицах может быть несколько повторяющихся строк?

У меня есть три таблицы 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 как уникальным, а ее результирующие значения с разделением запятыми и ссудой как суммой.

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

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

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

person Md Kamran Azam    schedule 14.05.2018    source источник
comment
Ваш образец данных и желаемый результат не имеют ничего общего. Где все эти значения в ваших выборочных данных? И в ваших таблицах не может быть bpm_no в качестве первичного ключа, потому что в ваших выборочных данных есть повторяющиеся значения для этого столбца. Рассматриваемая тема, похоже, генерирует список значений с разделителями. Об этом спрашивали и отвечали сотни, если не тысячи раз на SO.   -  person Sean Lange    schedule 14.05.2018
comment
@SeanLange. Не могли бы вы дать ссылку для ответа. Или вы можете предложить способы выполнения вышеуказанного запроса.   -  person Md Kamran Azam    schedule 14.05.2018
comment
stackoverflow.com/questions/451415/   -  person Sean Lange    schedule 14.05.2018
comment
@SeanLange. Ссылка, которую вы дали, показывает, как сделать значения, разделенные запятыми, я могу сделать это через Stuff, но мне нужна общая процедура для достижения моей итоговой таблицы, которая также будет включать суммирование столбца заемных_ос. Как мы можем сделать это за одну процедуру. Кроме того, есть ли способ добиться этого с помощью курсора?   -  person Md Kamran Azam    schedule 14.05.2018
comment
Похоже, это вопрос использования groupby (дубликат: stackoverflow.com/questions/39922986/pandas-group-by-and-sum) Единственное отличие состоит в том, что: 1. одна из ваших таблиц ничего не делает 2. у вас есть 2 таблицы, которые вы хотите использовать groupby, затем присоединяйтесь к результатам.   -  person ntg    schedule 14.05.2018
comment
Вы НЕ хотите использовать здесь курсор. Вам нужно думать о том, что вы хотите сделать со столбцом, а не о том, что вы хотите сделать для каждой строки. Чтобы получить СУММ, вам нужно использовать СУММ. docs. microsoft.com/en-us/sql/t-sql/functions/   -  person Sean Lange    schedule 14.05.2018
comment
@SeanLange. Понятно, я уже использовал функцию Sum и все ваши подходы, но конечный результат не такой, как ожидалось. Когда я запускаю оператор суммы отдельно, он отлично работает и отображает результат для каждого bpm_no как уникальный, но всякий раз, когда я пытаюсь это сделать с помощью процедуры, он дает неожиданный результат, например, bpm_no, повторяющийся несколько раз, а также значение суммы оказывается неверным. Просто помогите мне в достижении этой процедуры использования. Если хочешь, могу поделиться своей процедурой.   -  person Md Kamran Azam    schedule 14.05.2018
comment
Вы всегда должны делиться тем, что пробовали. Часто требуется лишь небольшая настройка.   -  person Sean Lange    schedule 14.05.2018


Ответы (2)


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

Сценарий таблицы и образцы данных

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

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

person DxTx    schedule 14.05.2018
comment
Спасибо, попробую и верну вам. - person Md Kamran Azam; 14.05.2018
comment
Отличное объяснение, сэр. Именно то, что мне нужно. Спасибо. - person Md Kamran Azam; 14.05.2018
comment
@MDKAMRANAzam, добро пожаловать. Спасибо. Рад слышать. - person DxTx; 14.05.2018

Если вы уже используете SQL Server 2017, вы можете использовать _ 1_, чтобы получить список пользователей:

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];
person sticky bit    schedule 14.05.2018