SQL SERVER 多行转为一列

一、多行转成一列(并以“,”分隔

表名: 费目主表(T_MAIN) ,表数据如下

2、费项明细表( T_DETAIL )数据如下:

上述两表通过 FEEGROUPID关联。

想要的效果如下:

 

 查询SQL如下:

SELECT FEEGROUPID, GROUPCODE , GROUPNAME,
ITEMCODE =(STUFF((
SELECT ',' + ITEMCODE FROM T_DETAIL G1 WHERE G1.FEEGROUPID = T.FEEGROUPID FOR XML PATH('') )
, 1,1,''))
FROM T_MAIN

SQL 解释:

1、 STUFF()函数是为去除结果列 (ITEMCODE)的首字母“,”

2、FOR XML PATH(''):是为了将ITEMCODE的行转为  XML文本列, 

 

内是为了不生成XML文本的首节点标签, SELECT ',' 是为了不生成XML文本的子节点标签

 

二、一列转多行

源表( T_TEST)数据如下:

想要的结果如下:

查询SQL:

SELECT a.FeeGroupId, GroupCode, b.[value]
FROM (SELECT FeeGroupId, GroupCode, [value]=CAST('<v>'+REPLACE(ItemCode,',','</v><v>')+'</v>' AS xml) FROM T_TEST) a
OUTER APPLY (SELECT [value]=T.C.value('.','varchar(50)') FROM a.[value].nodes('/v') AS T(C)) b

 

三、将数据按某列分组后,取此组前几行数据

SELECT T.FEEGROUPID, ITEMCODE, ITEMNAME FROM
(SELECT FLM_FEEITEMLIST.*,ROW_NUMBER() OVER(PARTITION BY FEEGROUPID ORDER BY FEEGROUPID DESC) RN FROM FLM_FEEITEMLIST WHERE ITEMCODE LIKE '10%') T
WHERE RN<=4

 

posted @   千年海岩  阅读(1622)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示