Sql server SQL server将行合并到列
我在SQL server中将两行合并为一列时遇到问题。这是我想做的我原来的桌子是这样的Sql server SQL server将行合并到列,sql-server,Sql Server,我在SQL server中将两行合并为一列时遇到问题。这是我想做的我原来的桌子是这样的 -------------------------------------------- | id || D_code1 || D_code2 || Dcode3 | -------- ---------- -------- -------- | 1 || 2f || v012 || F013 | | 1 || k013
--------------------------------------------
| id || D_code1 || D_code2 || Dcode3 |
-------- ---------- -------- --------
| 1 || 2f || v012 || F013 |
| 1 || k013 || c190 || NULL |
--------------------------------------------
我想把它像这样装进去。这有点复杂
----------------------------------
| id || D_code |
---- ------------------------
| 1 || 2f,v012,F013,k013,c190 |
----------------------------------
谁能帮我一下吗。我是sql server新手。提前谢谢 您可以使用类似的东西和xml
SELECT distinct i.id AS [id],
STUFF(( SELECT ',' + t.d_code1+' ,' +t.d_code2+' , '+t.d_code3 AS [text()]
FROM mytable t
WHERE
t.id = i.id
FOR XML PATH('')
), 1, 1, '' )
AS [dcode]
FROM mytable i
从严格意义上讲,如何实现结果,一个可能的答案是自连接。假设密钥是复合D_代码1/D_代码2/D_代码3,则可以通过以下方式执行查询:
select t1.id,
isnull(t1.D_code1,'') + ',' +
isnull(t1.D_code2,'') + ',' +
isnull(t1.D_code3,'') + ',' +
isnull(t2.D_code1,'') + ',' +
isnull(t2.D_code2,'') + ',' +
isnull(t2.D_code3,'') as D_code
from t t1
join t t2 on t1.id=t2.id
and
isnull(t1.D_code1,'') + isnull(t1.D_code2,'') + isnull(t1.D_code3,'')
<
isnull(t2.D_code1,'') + isnull(t2.D_code2,'') + isnull(t2.D_code3,'')
选择t1.id,
isnull(t1.D_代码1,)+,'+
isnull(t1.D_代码2',)+','+
isnull(t1.D_代码3',)+','+
isnull(t2.D_代码1,)+,'+
isnull(t2.D_代码2',)+','+
isnull(t2.D_代码3'')作为D_代码
从t1开始
在t1.id=t2.id上连接t2
和
isnull(t1.D_代码1')+isnull(t1.D_代码2')+isnull(t1.D_代码3')
<
isnull(t2.D_代码1',)+isnull(t2.D_代码2',)+isnull(t2.D_代码3',)
您可以使用XML路径
和STUFF
函数来执行此操作:
;WITH mytable1
AS (
SELECT id
,CONCAT (D_code1,',',D_code2,',',ISNULL(Dcode3, '')) AS D_Code
FROM mytable
)
SELECT DISTINCT id
,REPLACE(LTRIM(RTRIM(REPLACE(STUFF((
SELECT ',' + D_Code
FROM mytable1 T1
WHERE T1.id = T2.id
FOR XML PATH('')
), 1, 1, ''),',',' '))),' ',',') AS D_Code
--couldn't remember how to remove the succeeding commas if it is blank,
--so used a replace and trim to do this
FROM mytable1 T2
关系数据库的设计不适合以您想要的方式处理数据。你确定你需要这样储存吗?当您执行
选择
来检索它时,您不能将其置于该格式吗?