Как можно выполнить группировку для следующего кода / группирование в данных XML - PullRequest
1 голос
/ 13 июля 2011
select               first name
              ,last name
               ,employeeID
                ,CASE
                     WHEN CONVERT(xml,detail).value('count(//education/item)','nvarchar(50)')=0 AND
                      CONVERT(xml,detail).value('(//preventive/itemValue/text())[1]','nvarchar(50)') LIKE '%Employee refuses to participate %' THEN
                           'AAA-1'

                       WHEN CONVERT(xml,detail).value('count(//education/item)','nvarchar(50)') =0 AND
                        CONVERT(xml,detail).value('count(//preventive/itemValue)','nvarchar(50)')=0 THEN
                            'AAA-2'
                        ELSE
                             'AAA-3'
                        END val

                        ,Start Date
                        ,End Date

FROM (HAS MULTIPLE JOINS HERE & CONDITION )



GROUP BY       first name
              ,last name
               ,employeeID
                ,CASE
                     WHEN CONVERT(xml,detail).value('count(//education/item)','nvarchar(50)')=0 AND
                      CONVERT(xml,detail).value('(//preventive/itemValue/text())[1]','nvarchar(50)') LIKE '%Employee refuses to participate %' THEN
                           'AAA-1'

                       WHEN CONVERT(xml,detail).value('count(//education/item)','nvarchar(50)') =0 AND
                        CONVERT(xml,detail).value('count(//preventive/itemValue)','nvarchar(50)')=0 THEN
                            'AAA-2'
                        ELSE
                             'AAA-3'
                        END 

                        ,Start Date
                        ,End Date

Мой код выполняется отлично, но когда я пишу выражение group by, он выдает ошибку, говорящую о том, что тип данных XML не может быть сгруппирован. Я знаю, что мы можем сделать это с помощью определенной пользователем функции. Может кто-нибудь, пожалуйста, дайте мне знать, как эта задача может быть достигнута. Мне нужно сгруппировать по пунктам в моем коде. Я использую SQL Server 2005/2008.

1 Ответ

1 голос
/ 13 июля 2011

Вы можете запросить свой XML в подзапросе с использованием перекрестного применения, а затем использовать значения, возвращенные из подзапроса в списке полей и в предложении group by.

declare @T table(XMLCol xml)

insert into @T values
('<root>1</root>'),
('<root>2</root>'),
('<root>3</root>'),
('<root>3</root>')

select X.Value
from @T
  cross apply (select T.N.value('.', 'int')
               from XMLCol.nodes('root') as T(N)) as X(Value)
group by X.Value

Результат:

Value
-----
1
2
3
...