我是sql server的新手。 我有一个查询从各种表中检索所需的数据。 结果与其他列一样,包含名称之类的内容,为简单起见而删除。
id xvalue
1 x
1 y
1 z
2 x
2 y
2 z
3 x
3 y
3 z
我想用select包装查询,将结果集连接成一个像这样的新结果集。
id xvalue
1 x,y,z
2 x,y,z
3 x,y,z
我试图找出如何使用for xml path选项并且似乎无法找到 正确的语法。
答案 0 :(得分:1)
我们在SQL中有两个表,其中列(id,mdf,hist)另一个表有列(id,hist)。第一个表叫做historial,第二个表是resultado。然后我们需要在mfn相同时连接hist列并将结果复制到resultado表中的列hist。
DECLARE @iterator INT
SET @iterator = 1
WHILE(@iterator< 100)/ *行数* /
BEGIN
DECLARE @ListaIncidencias VARCHAR(MAX) = ''
SELECT @ListaIncidencias = @ListaIncidencias + ';' + p.hist
FROM historial p WHERE mfn = @iterator
SET @ListaIncidencias = SUBSTRING(@ListaIncidencias,2,LEN(@ListaIncidencias))
SELECT @ListaIncidencias as 'Incidencias'
INSERT INTO resultado(hist) VALUES(@ListaIncidencias) /* Insert results in new table */
SET @iterator = @iterator + 1
END
答案 1 :(得分:0)
像这样的东西应该为你做的伎俩。 SQL Server应该只有一个简单的语法。但它会给你一个逗号和空格分隔的xValues列表。
SELECT id
,STUFF(
(SELECT DISTINCT
', ' + t.xvalue
FROM tableName t
WHERE t.id = t1.id
ORDER BY ', ' + t.xvalue
FOR XML PATH(''), TYPE
).value('.','varchar(max)')
,1,2, ''
) AS xvalue
FROM tableName t1
GROUP BY id
答案 2 :(得分:0)
select id,Ids=Stuff((SELECT ',' + xvalue FROM t t1 WHERE t1.id=t.id
FOR XML PATH (''))
, 1, 1, '' )
from t
GROUP BY id
答案 3 :(得分:0)
试试这个
CREATE TABLE #Tmp
(
id INT ,
xValue VARCHAR(10)
)
INSERT INTO #Tmp VALUES ( 1, 'x' )
INSERT INTO #Tmp VALUES ( 1, 'y' )
INSERT INTO #Tmp VALUES ( 1, 'Z' )
INSERT INTO #Tmp VALUES ( 2, 'A' )
INSERT INTO #Tmp VALUES ( 2, 'B' )
SELECT id ,
( STUFF(( SELECT DISTINCT
',' + CAST(xValue AS VARCHAR(20))
FROM #Tmp
WHERE id = t.id
FOR
XML PATH('')
), 1, 1, '') ) AS Data
FROM #Tmp t
GROUP BY id
答案 4 :(得分:0)
Azure SQL数据库和SQL Server 2016中有非常新的功能来处理这种确切的情况。例如:
select id, STRING_AGG(xvalue, ',') as xvalue
from some_table
group by id
STRING_AGG - https://msdn.microsoft.com/en-us/library/mt790580.aspx