SQLSERVER行转列 列转行

  • Post author:
  • Post category:其他


场景:

2个表

一个存储逗号分隔得系统编号 现在需要将系统编号转换为实际系统名称

在这里插入图片描述

1.行转列

将项目表的ApplySys 拆分为多条数据

SELECT ApplySys , * FROM p_project

SELECT * FROM dbo.myApplication

–行转列

SELECT ProjGuid,ApplySys,c.ApplicationName FROM (
SELECT  A.ProjGuid, B.ApplySys
	FROM(
	SELECT p_projectId ProjGuid,
	ApplySys=CONVERT(XML,'<v>' + REPLACE(ApplySys, ',', '</v><v>') + '</v>')
	FROM p_project
)AS A
OUTER APPLY(
	SELECT ApplySys=N.a.value('.', 'varchar(100)') FROM A.ApplySys.nodes('/v') N(a) 
)AS B
WHERE ISNULL(b.ApplySys,'')!=''
) T
LEFT JOIN myApplication c ON c.Application=t.ApplySys

在这里插入图片描述

2.列转行 将列数据 转换为一行 根据项目显示对应的系统


```sql
SELECT  
    ProjGuid,  
    ApplicationName = (  
               STUFF(  
                    (SELECT ',' + ApplicationName  
                     FROM temp  
                     WHERE ProjGuid = A.ProjGuid  
                     FOR xml path('')  
                    ),1,1,''  
                    )  
                 )  
FROM temp A  
GROUP by ProjGuid  



3.完整代码如下

```sql
```csharp
WITH temp AS (
SELECT distinct ProjGuid,ApplySys,c.ApplicationName FROM (
SELECT  A.ProjGuid, B.ApplySys
	FROM(
	SELECT p_projectId ProjGuid,
	ApplySys=CONVERT(XML,'<v>' + REPLACE(ApplySys, ',', '</v><v>') + '</v>')
	FROM p_project
)AS A
OUTER APPLY(
	SELECT ApplySys=N.a.value('.', 'varchar(100)') FROM A.ApplySys.nodes('/v') N(a) 
)AS B
WHERE ISNULL(b.ApplySys,'')!=''
) T
LEFT JOIN myApplication c ON c.Application=t.ApplySys
)
SELECT  
    ProjGuid,  
    ApplicationName = (  
               STUFF(  
                    (SELECT ',' + ApplicationName  
                     FROM temp  
                     WHERE ProjGuid = A.ProjGuid  
                     FOR xml path('')  
                    ),1,1,''  
                    )  
                 )  
FROM temp A  
GROUP by ProjGuid  



版权声明:本文为qq_25128693原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。