Динамический стержень адресов электронной почты - PullRequest
1 голос
/ 09 июля 2019

Я пытался исследовать это, и я не могу найти что-то подобное.У меня есть таблица, в которую можно добавлять и удалять записи много раз.Я понятия не имею, сколько столбцов мне понадобится, поэтому мне нужен динамический круг.Все примеры, которые я вижу, используют функцию windows, но я поворачиваю адреса электронной почты.

Таблица будет выглядеть примерно так:

Number | Email
--------------
1      | email1@email.com
1      | email2@email.com
1      | email3@email.com
2      | email4@email.com
2      | email5@email.com
3      | email6@email.com
4      | email7@email.com
4      | email8@email.com

Я хочу, чтобы таблица выглядела так (когдавсе включено):

Number | Email1           | Email2           | Email3           
---------------------------------------------------------------
1      | email1@email.com | email2@email.com | email3@email.com
2      | email4@email.com | email5@email.com |
3      | email6@email.com |                  |
4      | email7@email.com | email8@email.com |

Если бы номер 1 не был включен, он бы выглядел так:

Number | Email1           | Email2                     
--------------------------------------------
2      | email4@email.com | email5@email.com 
3      | email6@email.com |
4      | email7@email.com | email8@email.com

Спасибо за помощь!

Вот код длясоздать макет таблицы:

CREATE TABLE #table
(number INT, email VARCHAR(30))

INSERT INTO #table (number, email)
VALUES  (1,'email1@email.com')
       ,(1,'email2@email.com')
       ,(1,'email3@email.com')
       ,(2,'email4@email.com')
       ,(2,'email5@email.com')
       ,(3,'email6@email.com')
       ,(4,'email7@email.com')
       ,(4,'email8@email.com')

Это похоже на то, что я пробовал, я использовал счетчик, чтобы попытаться просто заставить его работать, но не смог.

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME(Number)
  FROM (SELECT p.Number FROM #table AS p
  GROUP BY p.Name) AS x;

SELECT @columns

SET @sql = N'
SELECT ' + STUFF(@columns, 1, 2, '') + '
FROM
(
  SELECT p.number, p.email
   FROM #test p
) AS j
PIVOT
(
  Count(email) FOR Name IN ('
  + STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
  + ')
) AS p;';
PRINT @sql;
EXEC sp_executesql @sql;

1 Ответ

2 голосов
/ 09 июля 2019

Сначала необходимо создать RNO путем разбиения на Number. Следующий запрос должен делать то, что вы хотите:

CREATE TABLE #table (Number INT, Email VARCHAR(30))
INSERT INTO #table (Number, Email)
VALUES  (1,'email1@email.com')
       ,(1,'email2@email.com')
       ,(1,'email3@email.com')
       ,(2,'email4@email.com')
       ,(2,'email5@email.com')
       ,(3,'email6@email.com')
       ,(4,'email7@email.com')
       ,(4,'email8@email.com')

SELECT *, ROW_NUMBER() OVER (PARTITION BY Number ORDER BY Number, Email) AS [RNO] INTO #temp FROM #table

DECLARE @DynamicCols NVARCHAR(MAX) = '';
DECLARE @pvt NVARCHAR(MAX) = '';

SET @pvt = STUFF(
  (SELECT DISTINCT N', ' + QUOTENAME([RNO]) FROM #temp FOR XML PATH('')),1,2,N'')

SET @DynamicCols = STUFF(
  (SELECT DISTINCT N', ' + QUOTENAME([RNO]) + ' AS '+ QUOTENAME('Email' + CAST([RNO] AS VARCHAR(MAX))) FROM #temp FOR XML PATH('')),1,2,N'')


EXEC (N'SELECT [Number],'+ @DynamicCols+'
            FROM #temp tmp
        PIVOT (MAX([Email]) FOR RNO IN('+@pvt+')) AS PIV');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...