SQL:如何将行转换为一个字段?

时间:2014-01-11 04:44:41

标签: sql sql-server

作为标题,

SQL:

  

从表格中选择*

数据:

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语句? 谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

1)如果似乎是c列的列[N][VAR]CHAR具有XML保留字符(例如&),则此解决方案将对这些字符进行编码,结果将包括{{1而不是&amp(这只是一个例子)。

&

2)最好定义最大值。使用可变长度类型(SELECT 'AB1&2' FOR XML PATH('') -- AB1&amp;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 [N][VAR]CHAR等)时的长度,精度和比例,避免因此默认最大值。这些类型的长度,精度和比例可能导致不希望的截断/舍入。

NUMERIC/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

3)

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

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