作为标题,
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语句? 谢谢!
答案 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而不是&
(这只是一个例子)。
&
2)最好定义最大值。使用可变长度类型(SELECT 'AB1&2' FOR XML PATH('')
-- AB1&2
SELECT STUFF((SELECT 'AB1&2' FOR XML PATH('')), 1, 2, '')
-- 1&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