2011-07-13 2 views
1
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 

Mon code est exécuté parfaitement bien, mais quand j'écris le groupe par clause, il renvoie une erreur en disant que type de données XML ne peuvent pas être regroupés. Je sais que nous pouvons le faire par fonction définie par l'utilisateur. Quelqu'un peut-il s'il vous plaît laissez-moi savoir comment cette tâche peut être accomplie. J'ai besoin de regrouper les clauses dans mon code. J'utilise SQL Server 2005/2008.Comment groupement se fait au code/groupe suivant se fait dans les données XML

Répondre

1

Vous pouvez interroger votre XML dans une sous-requête à l'aide d'une application croisée, puis utiliser les valeurs renvoyées par la sous-requête dans votre liste de champs et dans la clause 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 

Résultat:

Value 
----- 
1 
2 
3 
Questions connexes