SQL Server: объединение имен - несколько пользователей - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь объединить несколько пользователей в единственную строку.Вот пример моей базы данных:

dbo.Users

| UserId | AccountId | Title | FirstName | LastName |
| 1234   | 1001      | Mr    | John      | Banks    |   
| 1235   | 1001      | Mrs   | Georgia   | Banks    |
| 1236   | 1002      | Mr    | Chris     | Aims     |
| 1237   | 1002      | Mrs   | Caroline  | Hole     |

dbo.Account

| AccountId | SignUpDate | LastLoginDate |
| 1001      | 20/08/2017 | 13/06/2018    |
| 1002      | 20/08/2017 | 13/06/2018    |

Я хочу, чтобы эти пользователи могли получить строкукак это:

Account 1001: 
Mr J & Mrs G Banks

Account 1002:
Mr C Aims & Mrs C Hole

Кто-нибудь может сделать какие-либо предложения?

РЕДАКТИРОВАТЬ :

  • У учетных записей может быть максимум 2 пользователя
  • У учетных записей может быть отдельный пользователь
  • Счета могут иметь любое из следующих названий: Мисс, Мистер, Миссис, Мисс, Доктор, Проф, Мейджор, Епископ, Преподобный, Сэр, Дама, Лорд, Капитан, Леди
  • Счета должны показывать НазваниеИнициал и заголовок Инициал для сопоставления фамилий
  • В учетных записях должны отображаться заголовок Инициал и фамилия Имена заголовка Фамилия для несоответствующих фамилий

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Ваш ожидаемый ответ может выглядеть следующим образом:

;WITH CTE AS
(
    SELECT  1234  AS UserId , 1001  AS AccountId   , 'Mr' AS Title ,'John' AS FirstName      ,'Banks' AS     LastName   
UNION ALL
    SELECT  1235   ,1001      , 'Mrs'   , 'Georgia'   , 'Banks'    
UNION ALL           
    SELECT  1236   , 1002      , 'Mr'    , 'Chris'     , 'Aims'
UNION ALL 
    SELECT  1237   , 1002      , 'Mrs'   , 'Caroline'  , 'Hole'
)
,CTE1 AS
(
    SELECT UserId,AccountId,Title,FirstName,LastName, Title+SPACE(2)+LEFT(FirstName,1)+SPACE(2)+LastName AS FullName
    FROM CTE
)
,CTE2 AS
(   
    SELECT DISTINCT AccountId,(SELECT ','+FullName FROM CTE1 CC WHERE C.AccountId=CC.AccountId FOR XML PATH('')) AS CombName
    FROM CTE1 C
)
    SELECT 'Account '+ CAST(AccountId AS VARCHAR(10))+' : ' + CHAR(13)+REPLACE(SUBSTRING(CombName,2,LEN(CombName)),',',' & ') AS TotalColumn
    FROM CTE2
0 голосов
/ 13 июня 2018

Попробуйте, как это

DECLARE  @mockup TABLE(UserId INT,AccountId INT,Title VARCHAR(10),FirstName VARCHAR(100),LastName VARCHAR(100));
INSERT INTO @mockup VALUES
 (1234,1001,'Mr','John','Banks')
,(1235,1001,'Mrs','Georgia','Banks')
,(1236,1002,'Mr','Chris','Aims')
,(1237,1002,'Mrs','Caroline','Hole');

SELECT t1.AccountId
      ,STUFF((
        SELECT ' & ' 
               + CONCAT(t2.Title + ' '
                       ,LEFT(t2.FirstName,1) + ' '
                       ,CASE WHEN LEAD(t2.LastName) OVER(ORDER BY t2.UserId)=t2.LastName THEN NULL ELSE t2.LastName END)
        FROM @mockup t2
        WHERE t2.AccountId=t1.AccountId
        FOR XML PATH(''),TYPE
       ).value('.','nvarchar(max)'),1,3,'')
FROM @mockup t1
GROUP BY t1.AccountId;

Вы написали в комментарии о SQL-Server 2008. Это не допускает LEAD().Вы можете заменить строку на LEAD этим

,CASE WHEN (SELECT TOP 1 LastName FROM @mockup t3 WHERE t3.AccountId =t1.AccountId AND t3.UserId>t2.UserId)=t2.LastName THEN NULL ELSE t2.LastName END)
0 голосов
/ 13 июня 2018

Я оставлю вам конкатенацию.

Это относится к записям мистера и миссис

select * 
from Users mr 
join Users mrs 
  on mr.AccountId = mrs.AccountId 
 and mr.Title  = 'mr' 
 and mrs.title = 'mrs'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...