SQLSERVER行转列 列转行

本文介绍了一种使用SQL将逗号分隔的系统编号转换为实际系统名称的方法,通过行转列和列转行的技术实现数据的高效转换。

场景:
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  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值