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

我在SQL server中将两行合并为一列时遇到问题。这是我想做的我原来的桌子是这样的

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

关系数据库的设计不适合以您想要的方式处理数据。你确定你需要这样储存吗?当您执行
选择
来检索它时,您不能将其置于该格式吗?