Отображать несколько результатов в виде одной строки - PullRequest
0 голосов
/ 07 мая 2019

У меня есть таблица пользователей, у каждого из которых есть свой адрес электронной почты / имя пользователя / пароль и т. Д.

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

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

В настоящее время я извлекаю вторую таблицу emailS с помощью Join и собираю столбец emailAddress.Однако это приводит к тому, что несколько строк одного и того же пользователя отличаются друг от друга, и я бы предпочел, чтобы они были сжаты в одну строку с несколькими столбцами.

В настоящее время таблица настроена так:

UsersXEmails

USERID | EMAILADDRESSID | EMAILADDRESS
-------------------------------------------
 001           100        email1@test.com
 001           200        email2@test.com
 001           300        email3@test.com
 002           400        testing1@gmail.com
 002           500        testing2@gmail.com
 003           600        foobar@gmail.com

Возможно ли, чтобы мой вывод в моем отчете был:

USERNAME  | EMAIL   | ADDITIONALEMAIL1  | ADDITIONALEMAIL2 | ADDITIONALEMAIL3
------------------------------------------------------------------------------
Bob   | bob@bob.com |email1@test.com    |email2@test.com   | email3@test.com
Fred  | fred@fred   |testing1@gmail.com |testing2@gmail.com|             |
George| george@g.com|foobar@gmail.com   |                  |

1 Ответ

0 голосов

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

CREATE TABLE #Table
(
    UserId INT,
    item INT,
    EmailAddressID INT,
    EmailAddress VARCHAR(50)
);

INSERT INTO #Table
SELECT '1', '1','1', 'email2@test.com' UNION ALL
SELECT '1', '2','2', 'email1@test.com' UNION ALL
SELECT '1', '3','3', 'email4@test.com' UNION ALL
SELECT '1', '4','4', 'email5@test.com'UNION ALL
SELECT '2', '1','5', 'email1@test.com' UNION ALL
SELECT '2', '2','6', 'email2@test.com' UNION ALL
SELECT '2', '3','7', 'email3@test.com' UNION ALL
SELECT '2', '4','8', 'email4@test.com' UNION ALL
SELECT '2', '5','9', 'email5@test.com' UNION ALL
SELECT '3', '1','10', 'email1@test.com' UNION ALL
SELECT '3', '2','11', 'email2@test.com' 

DECLARE @MaxItem INT

SELECT TOP 1 @MaxItem = UserId 
FROM
    (SELECT UserId, COUNT(1) AS cont 
     FROM #Table 
     GROUP BY UserId) a 
 GROUP BY 
     UserId
 ORDER BY 
     MAX(a.cont) DESC

 DECLARE @columns VARCHAR(MAX);
 DECLARE @sql NVARCHAR(max)

 SET @columns = STUFF((SELECT ',' + QUOTENAME(item)
                       FROM
                           (SELECT item 
                            FROM #Table 
                            WHERE UserId = @MaxItem) AS T
                       ORDER BY item
                       FOR XML PATH('')), 1, 1, '');

 --SELECT     *     FROM    (      SELECT  UserId, EmailAddress,EmailAddressID    FROM #Table    ) AS T    PIVOT       (    MAX(EmailAddress)    FOR EmailAddressID IN ([1],[2],[3],[4],[5])    ) AS P order by UserId;

 SET @sql = N'SELECT * 
              FROM
                  (SELECT  UserId, EmailAddress, item
                   FROM #Table) AS T
              PIVOT   
                  (MAX(EmailAddress) 
                       FOR item IN (' + @columns + N')) AS P 
              ORDER BY UserId;'; 

  -- select @sql

EXEC sp_executesql @sql;
DROP TABLE #Table; 
...