Слияние полей с использованием XML-пути на сервере SQL, отображение запятой, где NULL - PullRequest
0 голосов
/ 01 декабря 2011

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

create table number(id nvarchar(255), billdate nvarchar(255))
insert into number(id,billdate) values ('56465','12/10/2011'),('56465','02/11/2011'),   
('46462','12/09/2009'),('46462','12/06/2010'),('32169','12/22/2009'),
('32169','12/31/2011'),('86835','12/10/2010'),('86835','22-Jan-2010'),
('65641',''),('65641','12-Aug-2009'),('22458','25-Aug-2007'),('22458','')

Для объединения строк я использую путь XML, как показано ниже

select Main.id,LEFT(Main.billdate,nullif(LEN(Main.billdate)-1,-1)) as "billdate"
from (select distinct ST2.id,(SELECT ST1.billdate + ',' AS [text()]
from NUMBER ST1 where ST1.id=ST2.id ORDER BY ST1.id FOR XML PATH (''))billdate
from NUMBER ST2)[Main]

Он отлично работает для данных этого примера, но проблема в том, что у меня естьогромные данные, и когда я применяю этот XML-код пути, запятая не отображается, если дата NULL, как для идентификатора 65641. Для меня важно отображать запятую вместо NULL.Куда я иду не так?Кто-нибудь может подсказать, почему вместо NULL не отображается запятая?

1 Ответ

0 голосов
/ 01 декабря 2011

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

select Main.id,LEFT(Main.billdate,nullif(LEN(Main.billdate)-1,-1)) as "billdate"
from 
(
    select distinct ST2.id,
    (
        SELECT ISNULL(ST1.billdate + ',', ',') AS [text()]
        from NUMBER ST1 
        where ST1.id=ST2.id 
        ORDER BY ST1.id 
        FOR XML PATH ('')
    ) billdate
    from NUMBER ST2
)[Main]

Другая проблема, с которой вы можете столкнуться, заключается в том, что если для данного id имеется только одно пустое значение / значение NULL, вы не получите ни одной запятой для него. Это происходит потому, что одно пустое значение генерирует только одну запятую, которая затем удаляется вашим оператором LEFT. Вы можете оставить один запятый в одиночку, изменив его следующим образом:

select Main.id,LEFT(Main.billdate,nullif(LEN(Main.billdate)-CASE WHEN LEN(Main.billdate) = 1 THEN 0 ELSE 1 END,-1)) as "billdate"
from 
(
    select distinct ST2.id,
    (
        SELECT ISNULL(ST1.billdate + ',', ',') AS [text()]
        from NUMBER ST1 
        where ST1.id=ST2.id 
        ORDER BY ST1.id 
        FOR XML PATH ('')
    ) billdate
    from NUMBER ST2
)[Main]

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

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