Как сгенерировать XML-путь в CASE - PullRequest
0 голосов
/ 13 февраля 2019

Редактировать: Попытка запроса списка путей XML, который был сужен оператором case.Столбец displayname содержит более 700 уникальных значений в базе данных.Однако, исходя из других критериев, включая AccountID и, если RenderedValue равен = '', оставшиеся результаты, скорее всего, будут меньше 5. Переменные в моем запросе: я не могу явно объявить идентификатор учетной записи или DisplayName.

У меня есть успешное заявление CASE самостоятельно.Но при попытке использовать оператор XML PATH извлекает все данные из таблицы и разделяет их запятой, а не только результаты предыдущего оператора CASE.Не могу понять, как их вложить.Помимо GUID в столбце 1, значения являются nvarchar.

Запрос без CASE

select tb1.AccountID,
 tb3.DisplayName,
 tb4.RenderedValue


from Accounts tb1

join Display tb2 on tb2.AccountID = tb1.AccountID
inner join ExtractDetail tb3 on tb3.ExtractID = tb2.ExtractID
left join ExtractDetailData tb4 on tb4.ExtractDetailID = tb3.ExtractDetailID

результат:

+-----------+---------------+-----------------------+
| AccountID |  DisplayName  |     RenderedValue     |
+-----------+---------------+-----------------------+
| E8175     | FirstName     | John                  |
| E8175     | LastName      | Smith                 |
| E8175     | StreetAddress | 123 Washington Street |
| E8175     | City          |                       |
| E8175     | State         | NY                    |
| E8175     | ZipCode       |                       |
| E8175     | PhoneNumber   | 555-555-5555          |
| E8175     | Email         | JohnSmith@aol.com     |
+-----------+---------------+-----------------------+

Запрос с CASE

select tb1.AccountID,
    CASE When tb4.RenderedValue = ''
    Then tb3.DisplayName
    Else ''
  End As MissingField

from Accounts tb1

join Display tb2 on tb2.AccountID = tb1.AccountID
inner join ExtractDetail tb3 on tb3.ExtractID = tb2.ExtractID
left join ExtractDetailData tb4 on tb4.ExtractDetailID = tb3.ExtractDetailID

Where tb4.RenderedValue =''

Результат:

+-----------+--------------+
| AccountID | MissingField |
+-----------+--------------+
| E8175     | City         |
| E8175     | ZipCode      |
+-----------+--------------+

Ожидаемый результат:

+-----------+--------------+
| AccountID | MissingField |
+-----------+--------------+
| E8175     | City,ZipCode |
+-----------+--------------+

1 Ответ

0 голосов
/ 13 февраля 2019
i think this code will help you 
create table  #temp (AccountID varchar(20),DisplayName varchar(20),RenderedValue   varchar(255))
 insert into #temp (AccountID,DisplayName,RenderedValue) values 
 ('E8175','FirstName','John')
 insert into #temp (AccountID,DisplayName,RenderedValue)  values 
 ('E8175','LastName','Smith')
 insert into #temp (AccountID,DisplayName,RenderedValue) values 
 ('E8175','StreetAddress','123 Washington Street')

 insert into #temp (AccountID,DisplayName,RenderedValue) values ('E8175','City','')
 insert into #temp (AccountID,DisplayName,RenderedValue)  values        
 ('E8175','State','NY')
 insert into #temp (AccountID,DisplayName,RenderedValue)  values 
 ('E8175','ZipCode','')
 insert into #temp (AccountID,DisplayName,RenderedValue)  values 
 ('E8175','PhoneNumber','555-555-5555 ')
 insert into #temp (AccountID,DisplayName,RenderedValue)  values 
 ('E8175','Email','JohnSmith@aol.com')





  SELECT distinct
P.AccountID,
STUFF
(
    (
        SELECT ',' +  case when RenderedValue = '' Then DisplayName Else '' End  
        FROM #temp M

        FOR XML PATH(''), type
    ).value('.', 'varchar(max)'), 1, 1, ''
     ) AS Temp
     FROM
    #temp P


  Drop table #temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...