2014-01-11 37 views
0

標題,SQL:如何將行轉換爲一個字段?

SQL:

SELECT * FROM表

數據:

id  b c d 

4  17 Q 1 
5  17 Z 9 
6  17 G 5 
7  18 Q 3  

我需要以下結果:

b field 

17 Q:1,Z:9,G:5 
18 Q:3 

我該如何更改SQL語句? 謝謝!

+0

什麼是你的DBMS? –

+0

我使用SQL服務器 –

回答

1

像這樣:

SELECT b, STUFF((select ', ' + c + ': ' + cast(d as varchar) 
     FROM table xt 
     WHERE xt.b = t.b 
     FOR XML PATH('')), 1, 2, '') 
FROM table t 
GROUP BY b 
+0

它的工作原理!非常感謝 。 –

1

1)如果這似乎是一個[N][VAR]CHAR柱柱c具有XML保留字符(爲例&)然後將此溶液將編碼這些字符,並且結果將包括&amp代替& (這只是一個例子)。

SELECT 'AB1&2' FOR XML PATH('') 
-- AB1&2 
SELECT STUFF((SELECT 'AB1&2' FOR XML PATH('')), 1, 2, '') 
-- 1&amp;2 <- This time & remains encoded 
SELECT STUFF((SELECT 'AB1&2' FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(100)'), 1, 2, '') 
-- 1&2 <- This time & is decoded 

2)最好定義最大值。當使用可變長度類型([N][VAR]CHARNUMERIC/DECIMAL等)時,可以避免使用長度,精度和縮放比例,這些類型的長度,精度和比例可能會導致不希望的截斷/舍入。

SET ANSI_WARNINGS OFF 
SET ARITHABORT OFF 
SELECT 9999.*9999.*9999.*9999.*9999.*9999.*9999.*9999.*9999. AS T1 
SELECT CAST(9999.*9999.*9999.*9999.*9999.*9999.*9999.*9999.*9999 AS VARCHAR) AS T2 

輸出:

T1 
--------------------------------------- 
999100359916012598740083996400089999 

T2 
------------------------------ 
NULL 
Arithmetic overflow occurred. <-- This is just an warning 

3)

SELECT x.b, STUFF(
      (SELECT ', ' + y.c + ': ' + cast(y.d as VARCHAR(50)) -- <- Please use the corect max. length 
      FROM dbo.MyTable y 
      WHERE y.b = x.b 
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 
     , 1, 2, '') AS GroupConcat 
FROM dbo.MyTable x 
GROUP BY x.b