2011-06-20 183 views
3

SQL服務器串連的列值2005具有相同值的行(不同列)

我有返回

ID name prop value 
-------------------------- 
1 one  Prop1 a 
1 one  Prop1 b 
1 one  Prop2 c 
2 two  Prop1 d 
2 two  Prop2 e 

我如何運行選擇一個表就可以返回

ID name prop  value 
----------------------------- 
1 one  Prop1  a,b 
1 one  Prop2  c 
2 two  Prop1  d 
2 two  Prop2  e 
+0

你是怎樣的你想要的最後一排得到'4 ID'輸出? – JNK

+1

看看http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-ms-sql-server-2005。 – a1ex07

+0

@JNK - 修正了問題 – Omar

回答

3

試試這個:

--Concatenation with FOR XML and eleminating control/encoded character expansion "& < >" 
set nocount on; 
declare @YourTable table (RowID int, RowName varchar(5), prop varchar(5), RowValue varchar(5)) 

insert into @YourTable VALUES (1,'one','Prop1','a') 
insert into @YourTable VALUES (1,'one','Prop1','b') 
insert into @YourTable VALUES (1,'one','Prop2','c') 
insert into @YourTable VALUES (2,'two','Prop1','d') 
insert into @YourTable VALUES (2,'two','Prop2','e') 
set nocount off 

SELECT 
    t1.RowID,t1.RowName,t1.Prop 
     ,STUFF(
        (SELECT 
         ', ' + t2.RowValue 
         FROM @YourTable t2 
         WHERE t1.RowID=t2.RowID AND t1.RowName=t2.RowName AND t1.Prop=t2.Prop 
         ORDER BY t2.RowValue 
         FOR XML PATH(''), TYPE 
        ).value('.','varchar(max)') 
        ,1,2, '' 
      ) AS ChildValues 
    FROM @YourTable t1 
    GROUP BY t1.RowID,t1.RowName,t1.Prop 

OUTPUT:

RowID  RowName Prop ChildValues 
----------- ------- ----- ------------ 
1   one  Prop1 a, b 
1   one  Prop2 c 
2   two  Prop1 d 
2   two  Prop2 e 

(4 row(s) affected) 
+0

如果這些值包含「&」,「<', '>」等任何「特殊」字符,則使用xml連接行可能會產生問題。我的答案中的代碼將正確處理所有特殊字符。例如,如果上表中最後一列的值爲'a&',則此代碼將正確顯示'a&',其他大多數XML連接代碼都會顯示錯誤地顯示爲'a &'。 –

0
SELECT T1.Name, T1.prop, T1.value+","+T2.value 
From Table T1 INNER JOIN Table T2 
ON T1.name = T2.name and T1.prop = T2.Prop and T1.value<>T2.value 

雖然這隻適用於兩個值。讓我知道,我可以重寫N值。

+1

我沒有DV,但我不認爲這是他之後的事情。我不認爲他想手動確定有多少值,併爲許多次出現編寫代碼。 – JNK

+0

是的,我期望N個值。 – Omar